使用php函数循环数组值
我正试图用mysql作为存储数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码,但是,所有的代码都是HTML作为输出,因为我使用twig,所以我需要数组作为输出,让twig渲染它(或者可能还有其他选项,如果有的话请告诉我)。使用php函数循环数组值,php,mysql,arrays,multidimensional-array,twig,Php,Mysql,Arrays,Multidimensional Array,Twig,我正试图用mysql作为存储数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码,但是,所有的代码都是HTML作为输出,因为我使用twig,所以我需要数组作为输出,让twig渲染它(或者可能还有其他选项,如果有的话请告诉我)。 如果我使用html作为输出,这段代码就可以工作。但如果我改为数组作为输出,问题是第二级菜单仅显示1个数组或第一个数组,它不会循环。 这是我从mysql查询中得到的数组输出 Array ( [0] => Array (
如果我使用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)
这是上面代码的输出
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。如果有错误,从我的代码让我知道,如果有链接做这项工作,让我知道。谢谢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()
的每次调用,孔菜单数组都是迭代的。这在下一个版本中仍然可以改进
结果如下:
数组
(
[0]=>阵列
(
[链接]=>1.html
[标题]=>仪表板
[sub]=>阵列
(
)
)
[1] =>阵列
(
[链接]=>2.html
[标题]=>主数据
[sub]=>阵列
(
[0]=>阵列
(
[链接]=>11.html
[标题]=>submaster
[sub]=>阵列
(
)
)
[1] =>阵列
(
[链接]=>12.html
[标题]=>submaster
[sub]=>阵列
(
)
)
)
)
)
此外,还有一些进一步的改进:为了删除空的子菜单数组,我添加了一个测试。参数的默认值设置为$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级深度数组转换为多级深度数组的另一个示例,请参见。好的,我对代码做了一些修改
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($allmenu,$id)
,它应该是“sub”=>sub($items,$item['id'),
顺便说一句,非常感谢,你救了我的命,用这个我可以创建很多嵌套菜单。希望这能奏效
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));
}
}
是的,你是对的。我在
sub()
中监督了$allmenu
的滥用。我在回答中编辑了这一点。在sub()
中测试空子菜单也是一个好主意。OP的函数sub()
在找到第一个子元素后由于返回而中断迭代。这是同样的问题。
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));
}
}