2012-06-13 1 views
2

Je dois créer un tableau à partir d'une base de données MySQL organisée comme siCréation d'un tableau en utilisant php récursive de MySQL

id description parentId  
1  Level 1  0   
2  Level 2  0   
3  Level 1a  1 
4  Level 1b  1 
5  Level 1a1  3 
6  Level 1a1a  5 

Alors que la sortie est comme ceci:

Level 1 
     Level 1a 
      Level 1a1 
       Level 1a1a 
     Level 1b 
Level 2 

Cependant, mon code actuel seulement sorties au deuxième niveau, puis fait de chaque enfant son propre parent. Voici le code actuel:

$query = "SELECT * FROM pB_test ORDER BY parentId ASC"; 
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); 

$tree = array(); 

while($row = mysql_fetch_assoc($result)) 
{ 
    if($row['parentId'] == 0) 
    { 
     $row['Children'] = array(); 
     $tree[$row['id']] = array(
           'id' => $row['id'], 
           'description' => $row['description'], 
           'parentId' => $row['parentId'] 
          ); 
    } 
    else 
    { 
     $tree[$row['parentId']]['Children'][$row['id']] = $row['description']; 
    } 
} 

$count = array_keys($tree); 

foreach ($count as $array) 
{ 
    ksort($tree[$array]['Children']); 
} 

echo print_r($tree, true); 

Toute aide ou coup de pouce dans la bonne direction serait génial. Vive

Mise à jour: Code de travail

$results = array(); 
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row; 

    $tree = null; 
foreach($results as $result) 
{ 
    $thisref = &$refs->{$result['id']}; 
    foreach($result as $k => $v) 
    { 
     $thisref->{$k} = $v; 
    } 
    if ($result['parentId'] == 0) { 
     $tree->{$result['id']} = &$thisref; 
    } else { 
     $refs->{$result['parentId']}->children->{$result['id']} = &$thisref; 
    } 
} 

$tree; // contains the newly sorted tree. 

} 

print_r($tree); 
+0

Du code serait utile. –

+0

Ajouté. Désolé pour la retenue là-bas. –

Répondre

4

Je trouve ce code pour le regroupement des réseaux entre parents et enfants d'être incroyable. J'ai testé dans 4 profondeurs sans problème quoi que ce soit. Ce n'est pas une fonction récursive cependant.

$tree = null; 
foreach($results as $result) 
{ 
    $thisref = &$refs->{$result['id']}; 
    foreach($result as $k => $v) 
    { 
     $thisref->{$k} = $v; 
    } 
    if ($result['parentId'] == 0) { 
     $tree->{$result['id']} = &$thisref; 
    } else { 
     $refs->{$result['parentId']}->children->{$result['id']} = &$thisref; 
    } 
} 

$tree; // contains the newly sorted tree. 

Vous pourriez avoir à faire quelques modifications pour que cela fonctionne pleinement avec votre situation. Mais fondamentalement, il boucle tous les résultats et les combine par référence.

Prenez note que le $tree type de données de fin est un object et non un array

Bonne chance

MISE À JOUR

Vous pouvez créer le tableau en tant que tels

$query = "SELECT * FROM pB_test ORDER BY parentId ASC"; 
$dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); 

$results = array(); 
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row 
} 
+0

Je vais paraître complètement idiot ici, mais comment puis-je charger le mysql dans cela. Les tableaux et foreach() ne sont pas mon truc et mon cerveau est complètement fondu en ce moment. –

+1

@KeiranLovett J'ai mis à jour ma réponse pour refléter votre commentaire – brenjt

+0

Merci beaucoup, merci de votre aide! –

1

Ce serait probablement plus facile si vous créiez un tableau mappé de l'ID à l'objet lorsque vous créez vos objets afin que vous puissiez facilement rechercher les objets imbriqués. Fondamentalement:

$tree = array(); 
$lookup = array(); 

while($row = mysql_fetch_assoc($result)) 
{ 
    $object = array('id' => $row['id'],   
        'description' => $row['description'],   
        'parentId' => $row['parentId']); 

    $lookup[$row['id']] = $object; 

    $parentId = $row['parentId']; 
    if ($parentId == 0) 
    { 
     $tree[] = $object; 
    } 
    else 
    { 
     $lookup[$parentId]['Children'][] = $object; 
    } 
} 
Questions connexes