使用函数 php 循环数组值
looping array value with function php
我正在尝试创建多级下拉菜单 mysql 作为商店数据,我使用 twig 作为主题引擎,我知道外面有很多代码,但是,所有这些 HTML 作为输出,因为我使用 twig,所以我需要数组作为输出,并让 twig 渲染它,(或者也许还有其他选择,如果是的话请告诉我)。
如果我使用 html 作为输出,则此代码有效。但是如果我更改为数组作为输出,问题是第二个菜单级别只显示一个数组或第一个数组,它不会循环。
这是我从 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
)
)
)
)
看到..在第二个数组(主数据)中应该有两个数组,对吗? link 11.html 和 12.html.
如果我的代码有错误,请告诉我,如果有 link 来完成这项工作,请告诉我。谢谢
由于 return,OP 的函数 sub()
在找到第一个子元素后中断迭代。最好用给定父 $id
和 return 的所有子元素构建一个数组,该数组位于函数末尾:
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.
中找到
好的,我根据你的代码做了一些改动。
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));
}
}
我正在尝试创建多级下拉菜单 mysql 作为商店数据,我使用 twig 作为主题引擎,我知道外面有很多代码,但是,所有这些 HTML 作为输出,因为我使用 twig,所以我需要数组作为输出,并让 twig 渲染它,(或者也许还有其他选择,如果是的话请告诉我)。
如果我使用 html 作为输出,则此代码有效。但是如果我更改为数组作为输出,问题是第二个菜单级别只显示一个数组或第一个数组,它不会循环。
这是我从 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
)
)
)
)
看到..在第二个数组(主数据)中应该有两个数组,对吗? link 11.html 和 12.html.
如果我的代码有错误,请告诉我,如果有 link 来完成这项工作,请告诉我。谢谢
由于 return,OP 的函数 sub()
在找到第一个子元素后中断迭代。最好用给定父 $id
和 return 的所有子元素构建一个数组,该数组位于函数末尾:
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.
中找到好的,我根据你的代码做了一些改动。
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));
}
}