Reputation: 3311
My existing array like this
$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
),
);
I want to create that array like below output.
Expected Array
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
)
)
)
)
I tried some code and those are not working . my work output was like this image
which repeating again in foreach loop in menu.
Upvotes: 1
Views: 1131
Reputation: 1866
You can use this function to construct menu recursively.
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;
}
Call it with $parentId = 0
and it will do work.
$readyMenu = makeMenu($itemsArray, 0);
Upvotes: 3
Reputation: 2995
This code will work for you, Try...
$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);
?
This will output like this :
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
)
)
Upvotes: 0