2010-01-19 10 views
3

J'ai un tableau semblable à ceci:PHP Traversant Fonction pour monotour tableau en tableau imbriqué avec des enfants - basé sur ID parent

Array 
(
    Array 
    (
     [ID] => 1 
     [parentcat_ID] => 0 
    ), 
    Array 
    (
     [ID] => 2 
     [parentcat_ID] => 0 
    ), 
    Array 
    (
     [ID] => 6 
     [parentcat_ID] => 1 
    ), 
    Array 
    (
     [ID] => 7 
     [parentcat_ID] => 1 
    ), 
    Array 
    (
     [ID] => 8 
     [parentcat_ID] => 6 
    ), 
    Array 
    (
     [ID] => 9 
     [parentcat_ID] => 1 
    ), 
    Array 
    (
     [ID] => 13 
     [parentcat_ID] => 7 
    ), 
    Array 
    (
     [ID] => 14 
     [parentcat_ID] => 8 
    ) 

) 

Mais je besoin d'une fonction pour mettre récursive chaque élément dans un « enfants » tableau dans le tableau parent correspondant. Donc, il ressemblerait plus à ceci:

Array 
(
    Array 
    (
     [ID] => 1 
     [parentcat_ID] => 0 
     [children] => Array (
      Array 
      (
       [ID] => 6 
       [parentcat_ID] => 1 
       [childen] => Array (
        Array 
        (
         [ID] => 8 
         [parentcat_ID] => 6 
         [children] => Array (
          Array 
          (
           [ID] => 14 
           [parentcat_ID] => 8 
          ) 
         ) 
        ) 
       ) 
      ), 
      Array 
      (
       [ID] => 7 
       [parentcat_ID] => 1 
       [children] => Array(
        Array 
        (
         [ID] => 13 
         [parentcat_ID] => 7 
        ) 
       ) 
      ), 
      Array 
      (
       [ID] => 9 
       [parentcat_ID] => 1 
      ) 

     ) 
    ) 
    Array 
    (
     [ID] => 2 
     [parentcat_ID] => 0 

    ) 

) 

J'espère que cela a du sens!

Répondre

12

Donnez un aller (testé sous php 5.2):

 
$inArray = array(
    array('ID' => '1', 'parentcat_ID' => '0'), 
    array('ID' => '2', 'parentcat_ID' => '0'), 
    array('ID' => '6', 'parentcat_ID' => '1'), 
    array('ID' => '7', 'parentcat_ID' => '1'), 
    array('ID' => '8', 'parentcat_ID' => '6'),   
    array('ID' => '9', 'parentcat_ID' => '1'), 
    array('ID' => '13', 'parentcat_ID' => '7'), 
    array('ID' => '14', 'parentcat_ID' => '8'),  
); 

function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) { 
    if(!is_array($inArray)) { 
     return; 
    } 

    if(!is_array($outArray)) { 
     return; 
    } 

    foreach($inArray as $key => $tuple) { 
     if($tuple['parentcat_ID'] == $currentParentId) { 
      $tuple['children'] = array(); 
      makeParentChildRelations($inArray, $tuple['children'], $tuple['ID']); 
      $outArray[] = $tuple; 
     } 
    } 
} 

$outArray = array(); 
makeParentChildRelations($inArray, $outArray); 

print_r($outArray); 
+0

Bien que votre solution fasse le travail, elle a l'inconvénient d'utiliser la récursivité, ce qui n'est pas nécessaire en soi. –

+1

@fireeyedboy: L'itération est humaine, la récursion est divine. ; P Je plaisante. Il y a bien sûr d'autres moyens aussi. – Max

+0

Ceci est un cas typique où la récursivité est très utile. Pour ne pas dire que c'est nécessaire cependant. –

3

J'ai récemment répondu à une question similaire. Here c'est. J'espère que cela correspond à vos besoins. Si non, faites le moi savoir, et je vais l'ajuster à vos spécifications.

EDIT
D'accord, voici la version ajustée qui devrait répondre à vos besoins. Notez que cette fonction permet également d'accéder à tous les éléments en tant qu'élément racine du tableau des résultats, avec leur ID en tant qu'index.

Ainsi, pour les enfants d'accès d'un élément avec id arbitraire n, vous feriez:

$multiArray = generateMultiArray($yourFlatArray); 
$children = $multiArray[ n ][ 'children' ]; // replace n with the id 

EDIT 2
oublié de intitiate tableau pour enfants articles qui ne sont pas un parent; ajouté maintenant. Dans le cas contraire, il entraînerait un avis en essayant d'y accéder avec:

$multiArray = generateMultiArray($yourFlatArray); 
$children = $multiArray[ $someIdWithoutChildren ][ 'children' ]; 
+0

je sorte de voir où il va, mais l'ajustement serait Incroyablement pratique :) – Joel

+0

Je vois comment ça marche mais ce n'est pas 'déplacer' les tableaux dans les tableaux 'enfants', c'est de les dupliquer (ou de ne pas désactiver les éléments qui sont encore au niveau racine) – Joel

+0

@Joel: ça fait des références pour eux, pas de doublons. Je pensais que vous pourriez aimer la commodité supplémentaire d'avoir tous les éléments encore accessibles au niveau de la racine aussi. J'utilise beaucoup cela moi-même parce que cela facilite la lecture en boucle des enfants d'objets imbriqués plus profonds. –