Listing Recursif

Résolu
David -  
 David -
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
David
 
Merci à toi c'est ce que je voulais :)
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
David
 
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
David
 
Personne ? :(
0

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

Posez votre question
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
David
 
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   Statut Membre Dernière intervention   133
 
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   Statut Membre Dernière intervention   133
 
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