Signaler

Listing Recursif [Résolu]

Posez votre question David - Dernière réponse le 17 mai 2017 à 19:09 par 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
Utile
+1
plus moins
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>";

Cette réponse vous a-t-elle aidé ?  
David- 17 mai 2017 à 19:09
Merci à toi c'est ce que je voulais :)
Répondre
Donnez votre avis
Utile
+0
plus moins
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>";

Donnez votre avis
Utile
+0
plus moins
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 :)
Donnez votre avis
Utile
+0
plus moins
Personne ? :(
Donnez votre avis
Utile
+0
plus moins
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 )

Donnez votre avis
Utile
+0
plus moins
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 :(
forum92 147Messages postés lundi 6 juillet 2015Date d'inscription 22 octobre 2017 Dernière intervention - 16 mai 2017 à 13:12
Est tu sur que tu n'as pas une erreur ailleurs car il me semble que ma solution marche...
Répondre
Donnez votre avis
Utile
-1
plus moins
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'];
}
?>
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !