2016-04-20 1 views
1

Mon tableau existant comme celui-citableau de filtre pour créer sous-menu du menu en php

$menus = array(
     0 =>array(
       "id"=> 1, 
       "name"=> "A", 
       "parent_id"=> 0 
      ), 
     1 =>array(
       "id"=> 2, 
       "name"=> "B", 
       "parent_id"=> 1 
      ), 
     2 =>array(
       "id"=> 3, 
       "name"=> "C", 
       "parent_id"=> 1 
      ), 
     3 =>array(
       "id"=> 4, 
       "name"=> "D", 
       "parent_id"=> 2 
      ), 
     4 =>array(
       "id"=> 5, 
       "name"=> "E", 
       "parent_id"=> 0 
      ), 

    ); 

Je veux créer ce tableau comme ci-dessous la sortie.

Tableau Expected

Array 
(
    [0] => Array 
     (
      [Menu] => Array 
       (
        [0] => Array 
          ([name] => A 
          [Sub_menu] => Array 
          (
            [0] => Array 
             (
             [name] => B 
            ), 
            [1] => Array 
            (
             [name] => C 
             [Sub_menu] => Array 
              (
               [0] => Array 
               (
               [name] => D 
              ), 

             ) 
            ) 
          ) 
         ), 
        [1] => Array 
          ([name] => E 

         ) 
       ) 
     ) 
) 

J'ai essayé un peu de code et ceux ne fonctionnent pas. ma sortie de travail était comme cette image enter image description here

qui se répète à nouveau dans foreach boucle dans le menu.

+1

Très bien que vous voulez atteindre cet objectif. mais qu'en est-il de votre effort? montrez-nous ce que vous avez essayé? –

+0

@Anant j'ai placé mon code php bien qu'il y ait un peu différent parce que j'ai travaillé sur la plate-forme MVC. –

+0

Andrew l'a eu - voir sa réponse. – larsAnders

Répondre

3

Vous pouvez utiliser cette fonction pour construire le menu récursive.

function makeMenu($items, $parentId) 
{ 
    $menu = array_filter($items, function ($item) use ($parentId) { 
     return $item['parent_id'] == $parentId; 
    }); 
    foreach ($menu as &$item) { 
     $subItems = makeMenu($items, $item['id']); 
     if (!empty($subItems)) { 
      $item['sub_menu'] = $subItems; 
     } 
    } 
    return $menu; 
} 

appel avec $parentId = 0 et il fera le travail.

$readyMenu = makeMenu($itemsArray, 0); 
+0

meilleur code à faire. +10 –

+0

merci qui m'a aidé. –

0

Ce code fonctionne pour vous, essayez ...

$all = array(
     0 =>array(
       "id"=> 1, 
       "name"=> "A", 
       "parent_id"=> 0 
      ), 
     1 =>array(
       "id"=> 2, 
       "name"=> "B", 
       "parent_id"=> 1 
      ), 
     2 =>array(
       "id"=> 3, 
       "name"=> "C", 
       "parent_id"=> 1 
      ), 
     3 =>array(
       "id"=> 4, 
       "name"=> "D", 
       "parent_id"=> 2 
      ), 
     4 =>array(
       "id"=> 5, 
       "name"=> "E", 
       "parent_id"=> 0 
      ), 
    ); 

foreach($all as $key => $val) 
{ 
    if($val['parent_id']==0) 
    { 
     $data[]=$val; 

     foreach($all as $k => $v) 
     { 
      if($val['id'] == $v['parent_id']){ 
       $data[$key]['sub_menu'][]= $v; 
       foreach($all as $a => $s) 
       { 
        if($v['id'] == $s['parent_id']){ 
         $data[$key]['sub_menu'][$key]['sub_menu'][]= $s; 
        } 
       } 
      } 
     } 
    } 
} 
echo "<pre>"; print_r($data); 
? 

Affichera comme ceci:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => A 
      [parent_id] => 0 
      [sub_menu] => Array 
       (
        [0] => Array 
         (
          [id] => 2 
          [name] => B 
          [parent_id] => 1 
          [sub_menu] => Array 
           (
            [0] => Array 
             (
              [id] => 4 
              [name] => D 
              [parent_id] => 2 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [id] => 3 
          [name] => C 
          [parent_id] => 1 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [id] => 5 
      [name] => E 
      [parent_id] => 0 
     ) 

) 
+0

Bro J'ai appliqué votre code ici https://eval.in/556627 pas même que vous l'avez dit. –

+0

regardez vous avez changé le nom de tableau à '$ All', il est' $ all' partout dans mon code ... –

+0

thats pourquoi il montre l'avertissement 'Argument invalide fourni pour foreach()', changer $ All à $ all –