Listing Recursif [Résolu/Fermé]

Signaler
-
 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

Messages postés
32986
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2021
3 563
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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Merci à toi c'est ce que je voulais :)
Messages postés
32986
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2021
3 563
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>";

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 :)
Personne ? :(
Messages postés
32986
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2021
3 563
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 )

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 :(
Messages postés
220
Date d'inscription
lundi 6 juillet 2015
Statut
Membre
Dernière intervention
14 août 2018
134
Est tu sur que tu n'as pas une erreur ailleurs car il me semble que ma solution marche...
Messages postés
220
Date d'inscription
lundi 6 juillet 2015
Statut
Membre
Dernière intervention
14 août 2018
134
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'];
}
?>