【问题标题】:How To Get Data from JSON Into Unordered List?如何从 JSON 中获取数据到无序列表中?
【发布时间】:2015-07-30 07:56:12
【问题描述】:

我有一个包含以下内容的 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级列表):

Perencanaan dan Pengadaan
    RKA / DPA
        Daftar RKA / DPA

我试过这段代码:

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

但我发现它不是动态的,因为它取决于字符串长度。我读过最好的方法是使用递归方法。但我找不到我的 JSON 文件的递归模式。有人可以帮我找到解决方案吗?谢谢

【问题讨论】:

  • 如果您有 100 个节点,那么它将是 |{1-1-1....-1}|=100?
  • ya @DanielKrom 这是我的问题。这就是为什么我说它可以用递归方法来完成。但我找不到我的 JSON 文件的递归模式。我真的需要这种模式。
  • 你需要递归来做到这一点..
  • 但是你想做什么?只是将其打印为列表?或者?规律是什么
  • 不需要递归

标签: php json


【解决方案1】:

我认为不可能直接对您的平面 JSON 数据进行递归调用。

我建议您先将平面数据转换为多维数组,然后递归生成菜单。

我从这里获取了部分代码:Dynamically creating/inserting into an associative array in PHP

$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);

演示:http://3v4l.org/dRK4f

输出:

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>

【讨论】:

  • 嘿@Typoheads 感谢您的回答。我尝试了您的代码并找到了解决方案。太棒了
猜你喜欢
  • 2019-01-15
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2018-11-29
  • 2021-09-05
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多