2010-05-13 4 views
0

Alors, j'ai une table comme tel:Obtenir les valeurs d'une table dans un arbre

id|root|kw1|kw2|kw3|kw4|kw5|name 
1| A| B| C| D| E| F|fileA 
2| A| B| | | | |fileB 
3| B| C| D| E| | |fileC 
4| A| B| | | | |fileD 

(plusieurs centaines de lignes ...)

Et je dois l'obtenir dans un arbre comme ce qui suit :

*A 
*B 
    -fileB 
    -fileD 
*C 
    *D 
    *E 
    *F 
    -fileA 
*B 
*C 
    *D 
    *E 
    -fileC 

Je suis assez sûr que la table est mal aménagée, mais c'est ce que je dois vivre avec.

J'ai lu un peu à propos de l'Adjacency List Model & Modified Preorder Tree Traversal mais je ne pense pas que mes données soient correctement présentées. Je pense que cela nécessite une fonction récursive, mais je ne suis pas du tout sûr de la façon de procéder.

Je suis ouvert à toutes les idées sur la façon d'y parvenir, même si cela signifie extraire les données dans une nouvelle table juste pour traiter cela.

Y a-t-il de bonnes options disponibles ou de bons moyens de le faire? (Les exemples sont un bonus bien sûr)

+0

Le tableau * est mal présenté. Refais-le. –

+0

Comme je l'ai dit ... "Je suis sûr que la table est mal aménagée, mais c'est ce que je dois vivre avec." - Pas en mon contrôle à ce moment-là. – Jason

Répondre

0

Voici la solution de travail la plus simple que je pourrais trouver.

Hypothèses:

  1. Vous avez un tableau de tableaux (votre jeu de résultats); il est nommé $rows.
  2. Les valeurs de colonne vides dans le jeu de résultats que vous avez indiqué ci-dessus sont égales à null.
  3. Il n'y a pas de branches dans votre arbre dont les noms sont des représentations sous forme de chaîne d'entiers.

Le code:

$tree = array(); 

foreach($rows as $row) { 
    // Second parameter: array of 6 items as per your sample result set 
    place_in_tree($tree, array($row['root'], ... $row['kw5']), $row['file']); 
} 

function place_in_tree(array $tree, array $path, $item) { 
    // While there are more branches to be taken in $path 
    while(($branch = array_shift($path)) !== null) { 
     // Create the new branch if it doesn't exist 
     if(!isset($tree[$branch])) { 
      $tree[$branch] = array(); 
     } 

     // Select the subtree in that branch for the next iteration 
     $tree = $tree[$branch]; 
    } 

    // Finally, add the item 
    $tree[] = $item; 
} 

Cela crée un tableau avec des tableaux imbriqués. Ce tableau contient un certain nombre d'éléments avec des clés de chaîne (ce sont des "branches" et sont de type array) et un certain nombre d'éléments avec des clés numériques (ce sont des "fichiers" et sont de type string). Les tableaux enfants sont peuplés de la même manière. Si vous avez besoin de quelque chose de plus proche de votre business model qu'une grande matrice de klaxon, vous pouvez modifier la sélection de branche et la logique de stockage des éléments dans la fonction place_in_tree ci-dessus. De plus, si l'hypothèse n ° 3 ci-dessus ne tient pas dans votre cas, vous devrez vous impliquer un peu de la même manière, soit en choisissant une façon non ambiguë de distinguer les branches et les feuilles de l'arbre, soit choisir une autre structure pour le représenter.

+0

Après quelques modifications qui ont fait l'affaire ... Merci – Jason

Questions connexes