Listing Recursif

Résolu
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

  1. Modérateur
    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
    1. Merci à toi c'est ce que je voulais :)
      0
  2. Modérateur
    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
    1. 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
      1. Modérateur
        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
        1. 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
          1. Est tu sur que tu n'as pas une erreur ailleurs car il me semble que ma solution marche...
            0
        2. 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