Listing Recursif

Résolu/Fermé
David - 10 mai 2017 à 21:48
 David - 17 mai 2017 à 19:09
Bonjour,

J'ai un petit problème, j'ai un tableau sous la forme suivante avec X elements

[138] => Array
(
[parent_id] => 18
[categorie_id] => 32
[nom_categorie] => test
)

[139] => Array
(
[parent_id] => 0
[categorie_id] => 283
[nom_categorie] => test2
)

J'aimerais pouvoir lister chaque catégorie dépendante des parents simplement de cette sorte ligne par ligne

Premiere categorie
Premiere categorie - test1
Premiere categorie - test2

Deuxieme categorie
Deuxieme categorie - test
Deuxieme categorie - test3
....

Et ainsi de suite, qui pourrait m'aider SVP ?
Merci

7 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
16 mai 2017 à 13:57
Voici la réponse ...

<?php
error_reporting(E_ALL);
ini_set('display-errors',"on");


function get_arbo($inputArray){
  $max = count($inputArray);
  $tree = array();
  $flat = array();
  // Create a flat hierarchy array of all entries by their id
  for ($i = 0; $i < $max; $i++) {
    $n = $inputArray[$i];
    $id = $n['categorie_id'];
    $flat[$id] = $n;
  }
  // Then check all those entries by reference
  foreach ($flat as $key => &$child) {
    if (!isset($child['children']))
      $child['children'] = array();
      $id = $child['categorie_id'];
      $pid = $child['parent_id'];
      if ($pid > 0) {
        $flat[$pid]['children'][] = &$child;
      } else {
        $tree[$id] = &$child;
     }
  }
 return array_values($tree); 
}


function display($arr,$cat_parent="", &$out=array()){
  foreach($arr as $C){  
    $nom_categorie = !empty($C['nom_categorie']) ? $C['nom_categorie'] : $cat_parent;
    $children = !empty($C['children']) ? $C['children'] : NULL;
    $out[] = $cat_parent . " " . $nom_categorie;
    if(is_array($children)){
      display($children,$cat_parent . " " . $nom_categorie ,$out);
    }
  }  
}


$test = array();
$test[0]['parent_id'] = 0;
$test[0]['categorie_id'] = 18;
$test[0]['nom_categorie'] = "test";

$test[1]['parent_id'] = 0;
$test[1]['categorie_id'] = 20;
$test[1]['nom_categorie'] = "test2";


$test[2]['parent_id'] = 18;
$test[2]['categorie_id'] = 21;
$test[2]['nom_categorie'] = "test3";

$test[3]['parent_id'] = 21;
$test[3]['categorie_id'] = 22;
$test[3]['nom_categorie'] = "test33"; 


display(get_arbo($test),"",$out);
echo "<pre>";
print_r($out);
echo "</pre>";

1
Merci à toi c'est ce que je voulais :)
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
11 mai 2017 à 01:02
Bonjour,

Petit problème ... l'exemple que tu donnes ... ne correspond pas à l'array que tu nous donnes...
Difficile dans ces conditions de savoir exactement ce que tu as et ce que tu veux....

Mais bon, je tente ma chance :

// $tonArray => ton array

$newarray = array();
foreach($tonArray as $R){
  $newarray [$R['parent_id']][$R['categorie_id']] = $R['nom_categorie'];
}

echo "<pre>";
print_r($newarray);
echo "</pre>";

0
Par exemple ce tableau

$test[0][parent_id] = 0;
$test[0][categorie_id] = 18;
$test[0][nom_categorie] = test;

$test[1][parent_id] = 0;
$test[1][categorie_id] = 20;
$test[1][nom_categorie] = test2;


$test[2][parent_id] = 18;
$test[2][categorie_id] = 21;
$test[2][nom_categorie] = test3;

$test[3][parent_id] = 21;
$test[3][categorie_id] = 22;
$test[3][nom_categorie] = test33;

et j'aimerais en sortie

$res[0] = test
$res[1] = test2
$res[2] = test test3
$res[3] = test test3 test33

C'est plus clair comme ca ? Merci :)
0
Personne ? :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
13 mai 2017 à 15:30
Voici un début de réponse : une fonction qui transforme ton array ... en un array structuré hierachiquement
$result = get_arbo($test);

function get_arbo($inputArray){
  $max = count($inputArray);
  $tree = array();
  $flat = array();
  // Create a flat hierarchy array of all entries by their id
  for ($i = 0; $i < $max; $i++) {
    $n = $inputArray[$i];
    $id = $n['categorie_id'];
    $flat[$id] = $n;
  }
  // Then check all those entries by reference
  foreach ($flat as $key => &$child) {
    if (!isset($child['children']))
      $child['children'] = array();
      $id = $child['categorie_id'];
      $pid = $child['parent_id'];
      if ($pid > 0) {
        $flat[$pid]['children'][] = &$child;
      } else {
        $tree[$id] = &$child;
     }
  }
 return array_values($tree); 
}


Donc à partir de là .. tu peux utiliser ce nouvel array pour réaliser ton affichage.
(il faudra le parcourir en utilisant la fonction is_array et refaire du récursif pour parcourir tous les noeuds enfants )

0
Pour jordane45 : La problème c'est que j'ai du mal avec le recursif...
Donc si c'est pour en refaire un derriere ca ne m'avance pas :(

Pour forum92 : Ta solution ne fonctionne pas, je n'ai rien du tout :(
0
forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
16 mai 2017 à 13:12
Est tu sur que tu n'as pas une erreur ailleurs car il me semble que ma solution marche...
0
forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
13 mai 2017 à 20:24
Bonjour,
Tu sais que toutes les entrées de ton tableau ont la même structure. Je te propose donc tout simplement :
<?php 
$res= array();
for( $i =0; $i<$test.length; $i++){
	$res[$i] = $test[$i]['nom_categorie'];
}
?>
-1