2014-05-02 3 views
1

J'ai $menu_array3 commebâtiment liste des menus récursive de navigation

Array 
(
    [9] => Array 
     (
      [category_name] => cat1 
      [category_id] => 9 
      [children] => Array 
       (
        [12] => Array 
         (
          [category_name] => test5 
          [category_id] => 12 
         ) 

        [10] => Array 
         (
          [category_name] => cat2 
          [category_id] => 10 
          [children] => Array 
           (
            [15] => Array 
             (
              [category_name] => cat7 
              [category_id] => 15 
              [children] => Array 
               (
                [18] => Array 
                 (
                  [category_name] => cat10 
                  [category_id] => 18 
                 ) 

                [16] => Array 
                 (
                  [category_name] => cat8 
                  [category_id] => 16 
                 ) 

               ) 

             ) 

            [17] => Array 
             (
              [category_name] => cat9 
              [category_id] => 17 
             ) 

           ) 

         ) 

       ) 

     ) 

    [11] => Array 
     (
      [category_name] => cat3 
      [category_id] => 11 
      [children] => Array 
       (
        [13] => Array 
         (
          [category_name] => cat5 
          [category_id] => 13 
         ) 

       ) 

     ) 

) 

ref pour this answer J'ai essayé de construire le menu de navigation à l'aide

function build_nav($category_name, $data) 
{ 
    $result = array(); 

    foreach ($data as $row) 
    { 
     if ($row['category_name'] == $category_name) 
     { 
      $result = "<li>" . $row['category_name'] . "</li>"; 
      $result= build_nav($row['category_name'], $data); 
     } 
    } 
    return $result; 
} 
$menu="<ul>"; 
$menu.=build_nav('cat1', $menu_array3); 
$menu.="</ul>"; 
echo "menu <pre>"; print_r($menu); echo "</pre>"; 

Mais je fus arrêté par

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 261900 bytes) 

Je vous demande de me corriger avec des suggestions. Merci à l'avance Modifier J'ai trouvé la solution pour générer le menu de navigation directement à partir de db à https://stackoverflow.com/a/3380296/1528701

+0

Vous remettez la structure '$ data' complète pour chaque itération des étapes de traitement récursives. Ainsi, chaque niveau de récursivité commence avec les mêmes données, ce qui signifie évidemment qu'il s'agit d'une boucle sans fin copiant les données encore et encore. Cette _must_ conduit au script se faire tuer par le serveur http. Au lieu de '$ data', vous devez remettre uniquement la partie des données qui se trouve réellement dans la catégorie qui vous intéresse pour la récursivité. Dans ce cas, c'est probablement l'entrée 'children'. – arkascha

+0

@arkascha Merci! Si j'écris 'array_pop()', ses enfants seront supprimés avant même qu'ils ne soient pris en compte pour le formatage. Quel peut être l'autre moyen de contourner le problème pour supprimer les données traitées! –

+0

Utilisez simplement '$ data ['children']', ou ai-je oublié quelque chose? Il serait également plus élégant d'utiliser des références pour ces appels récursifs au lieu de copier-par-valeur. De plus, vous n'obtiendrez pas un menu hiérarchique comme vous le souhaitez avec le code actuel. Mais vous comprendrez vous-même une fois que vous parvenez à obtenir une sortie utilisable. – arkascha

Répondre

0

La raison de cette erreur peut être que vous appelez votre build_nav() fonction dans la boucle foreach. Cela signifie que pour chaque valeur dans les données, build_nav() sera trigé dans lequel la boucle foreach sera de nouveau triggerd et ainsi de suite. Donc la réponse principale est: Vous avez créé une boucle infinie.

Je pense que vous avez peut-être mal interprété la réponse qui vous a inspiré pour faire cette fonction. Dans ce cas, ils utilisent un identifiant parent. Cela peut vous aider dans votre recherche. Notez également qu'ils n'utilisent pas un tableau profondément imbriqué comme celui que vous utilisez. Regardez bien et vous trouverez votre solution.

Questions connexes