Массив фильтров для создания подменю меню в Stack Overflow

мой существующий массив как это

$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

Решение

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

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

Другие решения

Этот код будет работать для вас, попробуйте …

$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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector