2009-10-22 6 views
1

Okay, fondamentalement, j'ai formé une requête mySQL qui retourne un ensemble de données tous triés parfaitement de ma structure de données. Si je devais déclarer, il ressemblerait à quelque chose comme ceci:PHP> Former un tableau multi-dimensionnel à partir d'un tableau plat modèle imbriqué

$arr = array(
     array('name' => 'Root', 'depth' => 0), 
     array('name' => 'Food', 'depth' => 0), 
     array('name' => 'Fruit', 'depth' => 1), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Apple', 'depth' => 2), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Meat', 'depth' => 1), 
     array('name' => 'Furniture', 'depth' => 0) 
     ); 

Ce que je veux, est d'alimenter cette arr $ dans une méthode afin que je puisse ensuite obtenir un tableau à plusieurs dimensions en arrière.

Par exemple, le fruit serait un enfant de la nourriture. Et Bananana serait un enfant de Fruit. J'ai besoin que les clés de chaque «enfant» soient des «pages».

Le tableau que j'ai montré ci-dessus peut également retourner d'autres informations telles que 'lft' et 'rgt'. Je n'ai pas de paramètre 'parentId' mais je peux changer mon modèle si c'est nécessaire, mais je préférerais rester avec le modèle de jeu imbriqué.

Répondre

4

Le code suivant suppose que l'ordre et la profondeur de vos valeurs sont correctes. Notez qu'il supprime les doublons en utilisant des clés.

header('Content-Type: text/plain'); 

$arr = array(
    array('name' => 'Root', 'depth' => 0), 
    array('name' => 'Food', 'depth' => 0), 
    array('name' => 'Fruit', 'depth' => 1), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Apple', 'depth' => 2), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Meat', 'depth' => 1), 
    array('name' => 'Furniture', 'depth' => 0) 
); 

function process(&$arr, &$prev_sub = null, $cur_depth = 0) { 
    $cur_sub = array(); 
    while($line = current($arr)) { 
    if($line['depth'] < $cur_depth) { 
    return $cur_sub; 
    } elseif($line['depth'] > $cur_depth) { 
    $prev_sub = process($arr, $cur_sub, $cur_depth + 1); 
    } else { 
    $cur_sub[$line['name']] = $line['name']; 
    $prev_sub =& $cur_sub[$line['name']]; 
    next($arr); 
    } 
    } 
    return $cur_sub; 
} 

$values = process($arr); 
print_r($values); 

Sortie:

Array 
(
    [Root] => Root 
    [Food] => Array 
     (
      [Fruit] => Array 
       (
        [Bannnanna] => Bannnanna 
        [Apple] => Apple 
       ) 
      [Meat] => Meat 
     ) 
    [Furniture] => Furniture 
) 
+0

C'est exactement ce que je cherchais, fonctionne très bien! Êtes-vous capable de poster comment ajouter des champs supplémentaires? – dzm

5

quelque chose comme ça peut-être

  $arr = array(
        array('name' => 'Root', 'depth' => 0), 
        array('name' => 'Food', 'depth' => 0), 
        array('name' => 'Fruit', 'depth' => 1), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Apple', 'depth' => 2), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Meat', 'depth' => 1), 
        array('name' => 'Furniture', 'depth' => 0) 
        ); 

      $p = array(array()); 
      foreach($arr as $n => $a) { 
       $d = $a['depth'] + 1; 
       $p[$d - 1]['children'][] = &$arr[$n]; 
       $p[$d] = &$arr[$n]; 
      } 

      print_r($p[0]); 
+0

S'il vous plaît pourriez-vous expliquer le code foreach que je ne peux vraiment pas comprendre comment le retour par des ouvrages de référence! Merci –

+0

@Laykes, Qu'avez-vous changé? – mattalxndr

+0

Désolé mattalexx: Je ne me souviens même plus avoir posé cette question. – Layke

Questions connexes