Php 如何将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"

我有一个包含以下内容的JSON文件:

"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>