Php 如何将JSON中的数据放入无序列表?
我有一个包含以下内容的JSON文件:Php 如何将JSON中的数据放入无序列表?,php,json,Php,Json,我有一个包含以下内容的JSON文件: "Menus": [{ "MenuId": "1", "MenuName": "Perencanaan dan Pengadaan", "MenuParent": "", "MenuLink": "" }, { "MenuId": "1-1", "MenuName": "RKA / DPA", "MenuParent": "1", "MenuLink": "" }, { "MenuId"
"Menus": [{
"MenuId": "1",
"MenuName": "Perencanaan dan Pengadaan",
"MenuParent": "",
"MenuLink": ""
}, {
"MenuId": "1-1",
"MenuName": "RKA / DPA",
"MenuParent": "1",
"MenuLink": ""
}, {
"MenuId": "1-1-1",
"MenuName": "Daftar RKA / DPA",
"MenuParent": "1-1",
"MenuLink": "rkbu"
},
我想动态地将数据放入无序列表中。所以我想要的输出是这样的(带有3级列表):
我尝试过以下代码:
echo "<ul>";
foreach($get_data['Menus'] as $node){
if(strlen($node['MenuId']) == 1){
echo "<li>" . $node['MenuName'];
echo "</li>";
}
echo "<ul>";
if(strlen($node['MenuId']) == 3){
echo "<li>".$node['MenuName']."</li>";
}
if(strlen($node['MenuId']) == 5){
echo "<ul>";
echo "<li>".$node['MenuName']."</li>";
echo "</ul>";
}
echo "</ul>";
}
echo "</ul>";
echo“”;
foreach($get_data['Menus']作为$node){
if(strlen($node['MenuId'])==1){
echo“- ”$node['MenuName'];
回声“
”;
}
回声“”;
if(strlen($node['MenuId'])==3){
echo“- ”$node['MenuName']。“
- ”;
}
if(strlen($node['MenuId'])==5){
回声“
”;
echo“- ”$node['MenuName']。“
- ”;
回声“
”;
}
回声“
”;
}
回声“
”;
但我发现它不是动态的,因为它取决于字符串长度。我已经读到最好的方法是使用递归方法。但是我找不到JSON文件的递归模式。有人能帮我找到解决办法吗?谢谢我认为直接对平面JSON数据进行递归调用是不可能的 我建议您首先将平面数据转换为多维数组,然后递归生成菜单 我从这里获取了部分代码:
$get\u data=array(
排列(
“MenuId”=>“1”,
“Menuame”=>“Perencanaan and Pengadaan”,
“MenuParent”=>“”,
“菜单链接”=>“
),
排列(
“MenuId”=>“1-1”,
“MENUAME”=>“RKA/DPA”,
“MenuParent”=>“1”,
“菜单链接”=>“
),
排列(
“MenuId”=>“1-1-1”,
“Menuame”=>“Daftar RKA/DPA”,
“MenuParent”=>“1-1”,
“MenuLink”=>“rkbu”
)
);
函数插入到(&$array,array$keys,$value){
$last=array\u pop($keys);
foreach($key作为$key){
如果(!array_key_)存在($key,$array)|
array_key_exists($key,$array)&&!is_array($array[$key])){
$array[$key]['items']=array();
}
$array=&$array[$key]['items'];
}
$array[$last]['value']=$value;
}
函数创建菜单($menuItems){
$content=“”;
foreach($menuItems作为$item){
$content.='- '.$item['value'];
if(设置($item['items')和计数($item['items')){
$content.=创建菜单($item['items']);
}
$content.='
';
}
$content.='
';
返回$content;
}
$menuItems=array();
foreach($get_data as$item){
$levels=分解('-',$item['MenuId']);
在($menuItems,$levels,$item['MenuName'])中插入_;
}
打印(菜单项);
打印创建菜单($menuItems);
演示:
输出:
Array (
[1] => Array (
[value] => Perencanaan dan Pengadaan
[items] => Array (
[1] => Array (
[value] => RKA / DPA
[items] => Array (
[1] => Array (
[value] => Daftar RKA / DPA
)
)
)
)
)
)
<ul>
<li>Perencanaan dan Pengadaan
<ul>
<li>RKA / DPA
<ul>
<li>Daftar RKA / DPA</li>
</ul>
</li>
</ul>
</li>
</ul>
数组(
[1] =>数组(
[价值]=>佩伦卡南和彭加丹
[项目]=>数组(
[1] =>数组(
[值]=>RKA/DPA
[项目]=>数组(
[1] =>数组(
[值]=>Daftar RKA/DPA
)
)
)
)
)
)
- 佩伦卡南和彭加丹
- RKA/DPA
- 达夫塔RKA/DPA
如果你有100个节点,它将是{1-1-1….-1}}=100?ya@DanielKrom,这是我的问题。这就是为什么我说它可以用递归方法实现。但是我找不到JSON文件的递归模式。我真的需要这个模式。你需要递归来做。但是你想做什么呢?把它打印成一个列表?或规则是什么?不需要递归。谢谢你的回答。我尝试了你的代码并找到了解决方案。真棒
$get_data = array(
array(
"MenuId" => "1",
"MenuName" => "Perencanaan dan Pengadaan",
"MenuParent" => "",
"MenuLink" => ""
),
array(
"MenuId" => "1-1",
"MenuName" => "RKA / DPA",
"MenuParent" => "1",
"MenuLink" => ""
),
array(
"MenuId" => "1-1-1",
"MenuName" => "Daftar RKA / DPA",
"MenuParent" => "1-1",
"MenuLink" => "rkbu"
)
);
function insert_into(&$array, array $keys, $value) {
$last = array_pop($keys);
foreach($keys as $key) {
if(!array_key_exists($key, $array) ||
array_key_exists($key, $array) && !is_array($array[$key])) {
$array[$key]['items'] = array();
}
$array = &$array[$key]['items'];
}
$array[$last]['value'] = $value;
}
function create_menu($menuItems) {
$content = '<ul>';
foreach($menuItems as $item) {
$content .= '<li>' . $item['value'];
if(isset($item['items']) && count($item['items'])) {
$content .= create_menu($item['items']);
}
$content .= '</li>';
}
$content .= '</ul>';
return $content;
}
$menuItems = array();
foreach($get_data as $item) {
$levels = explode('-', $item['MenuId']);
insert_into($menuItems, $levels, $item['MenuName']);
}
print_r($menuItems);
print create_menu($menuItems);
Array (
[1] => Array (
[value] => Perencanaan dan Pengadaan
[items] => Array (
[1] => Array (
[value] => RKA / DPA
[items] => Array (
[1] => Array (
[value] => Daftar RKA / DPA
)
)
)
)
)
)
<ul>
<li>Perencanaan dan Pengadaan
<ul>
<li>RKA / DPA
<ul>
<li>Daftar RKA / DPA</li>
</ul>
</li>
</ul>
</li>
</ul>