Мой существующий массив вроде этого

$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
            ),

     );

Я хочу создать этот массив, как показано ниже.

Ожидаемый массив

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

                          )
                )
         )
)

Я пробовал код, но он не работает. моя работа была похожа на это изображение введите описание изображения здесь

Который снова повторяется в цикле foreach в меню.

1
Lemon Kazi 20 Апр 2016 в 07:35

2 ответа

Лучший ответ

Вы можете использовать эту функцию для рекурсивного построения меню.

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;
}

Вызовите его с помощью $parentId = 0, и он будет работать.

$readyMenu = makeMenu($itemsArray, 0);
3
Andrew 20 Апр 2016 в 05:20

Этот код подойдет вам, попробуйте ...

$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);
?

Это будет выглядеть так:

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
Manjeet Barnala 20 Апр 2016 в 04:48