我试图使用mysql作为商店数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码但是,所有这些HTML都作为输出,因为我使用twig,所以我需要数组作为输出,并让twig渲染它,(或者可能有其他选项,如果有,请告诉我。)
如果我使用html作为输出,此代码工作。但如果我更改为数组作为输出问题是第二菜单级别只显示1个数组或第一个数组,它不循环
这是我从mysql查询输出的数组,
Array
(
[0] => Array
(
[id] => 1
[title] => Dashboard
[link] => 1.html
[parent_id] => 0
)
[1] => Array
(
[id] => 2
[title] => Master Data
[link] => 2.html
[parent_id] => 0
)
[2] => Array
(
[id] => 3
[title] => submaster
[link] => 11.html
[parent_id] => 2
)
[3] => Array
(
[id] => 4
[title] => submaster
[link] => 12.html
[parent_id] => 2
)
这里是我试图转换的代码,我的意思是在代码html作为输出之前(ul> li> ul> li> / li> / ul> / li> / lu)
$id = '';
function sub($items, $id){
foreach($items as $item){
if($item['parent_id'] == $id){
return array("link" =>$item['link'],"title"=>$item['title']);
sub($items, $item['id']);
}
}
}
foreach($allmenu as $data){
if($data['parent_id'] == 0){
$id = $data['id'];
$utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id));
}
}
这是上面代码的输出
Array
(
[links] => Array
(
[0] => Array
(
[link] => 1.html
[title] => Dashboard
[sub] =>
)
[1] => Array
(
[link] => 2.html
[title] => Master Data
[sub] => Array
(
[link] => 11.html
[title] => Kampus
)
)
)
)
看第二个数组中的..(主数据)应该两个数组吧?链接11.html和12.html。
如果我的代码有错误让我知道,如果有链接做这个工作,请告诉我。感谢
答案 0 :(得分:1)
OP的函数sub()
在返回后找到第一个子元素后中断迭代。最好使用给定父$id
的所有子元素构建一个数组,并在函数末尾返回此数组:
function sub($items, $id){
$subarray = array();
foreach($items as $item){
if($item['parent_id'] == $id){
$subarray[] = array(
"link" => $item['link'],
"title" => $item['title'],
"sub" => sub($items, $item['id']),
);
}
}
return $subarray;
}
我还在子阵列的构建中集成了sub()
的调用。缺点是对于函数sub()
的每次调用,都会迭代孔菜单数组。在下一个版本中,这仍然可以改进。
结果如下:
Array
(
[0] => Array
(
[link] => 1.html
[title] => Dashboard
[sub] => Array
(
)
)
[1] => Array
(
[link] => 2.html
[title] => Master Data
[sub] => Array
(
[0] => Array
(
[link] => 11.html
[title] => submaster
[sub] => Array
(
)
)
[1] => Array
(
[link] => 12.html
[title] => submaster
[sub] => Array
(
)
)
)
)
)
此外还有一些进一步的改进:要删除空的子菜单数组,我要包含一个测试。参数的默认值设置为$id = 0
。有了这个,就不需要为初始调用传递父ID。现在不再需要主程序中的foreach循环了。您可以直接致电sub()
。使用与OP相同的变量名称,程序如下所示:
function sub($items, $id = 0){
$subarray = array();
foreach($items as $item){
if($item['parent_id'] == $id) {
$submenu = array(
"link" => $item['link'],
"title" => $item['title'],
);
$subsubmenu = sub($items, $item['id']);
if (!empty($subsubmenu)) {
$submenu['sub'] = $subsubmenu;
}
$subarray[] = $submenu;
}
}
return $subarray;
}
$utama = sub($allmenu);
有关如何将2级深度数组转换为多层深度数组的另一个示例可以在this answer中找到。
答案 1 :(得分:0)
好的,我从你的代码中改了一点。
function sub($items, $id){
$subarray = array();
foreach($items as $item){
if($item['parent_id'] == $id){
$submenu = sub($items, $item['id']);
if (empty($submenu)) {
$subarray[] = array("link" => $item['link'], "title" => $item['title']);
} else {
$subarray[]= array("link" => $item['link'], "title" => $item['title'], "sub" => $submenu);
}
}
}
return $subarray;
}
就像$ utama中的数组一样,如果有一个sub写它,并且你的代码"sub" => sub($allmenu, $id)
中有拼写错误,它应该是"sub" => sub($items, $item['id'),
btw非常感谢,你救了我的命我可以创建很多嵌套菜单。
答案 2 :(得分:0)
希望这项工作
function sub($items, $id){
foreach($items as $item){
if($item['parent_id'] == $id){
$sub = sub($items, $item['id']);
if(!empty($sub))
return array("link" =>$item['link'],"title"=>$item['title'],"sub"=>$sub);
return array("link" =>$item['link'],"title"=>$item['title']);
}
}
}
foreach($allmenu as $data){
if($data['parent_id'] == 0){
$id = $data['id'];
$utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id));
}
}