Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将我的JSON字符串格式化为<;ol>;PHP中的有序列表_Php_Html_Json - Fatal编程技术网

将我的JSON字符串格式化为<;ol>;PHP中的有序列表

将我的JSON字符串格式化为<;ol>;PHP中的有序列表,php,html,json,Php,Html,Json,我正在为一个宠物项目做一个简单的CMS。我目前有一个JSON字符串,其中包含菜单结构的页面ID和父页面ID的列表 现在我想将这个字符串转换成嵌套的或层次结构的列表(有序列表) 我试着寻找循环,但似乎最终得到了一系列过于复杂的子类。我正在努力用PHP找到一个合适的轻量级解决方案 以下是JSON: **[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]** 以下是所需的输出: <o

我正在为一个宠物项目做一个简单的CMS。我目前有一个JSON字符串,其中包含菜单结构的页面ID和父页面ID的列表

现在我想将这个字符串转换成嵌套的或层次结构的列表(有序列表)

我试着寻找循环,但似乎最终得到了一系列过于复杂的子类。我正在努力用PHP找到一个合适的轻量级解决方案

以下是JSON:

**[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]**
以下是所需的输出:

<ol>
  <li>3
    <ol>
      <li>4</li>
         <ol>
            <li>5</li>
         </ol>
    </ol>
  </li>
  <li>6</li>
  <li>2</li>
  <li>4</li>
</ol>

  • 三,
  • 四,
  • 五,
  • 六,
  • 二,
  • 四,
  • PHP中有没有内置的东西可以简化这个过程?以前有人有过这种经历吗

    我是PHP和SE的新手。期待您的来信

    这是我目前的进展(效果不太好)

    
    

    您可以使用递归深入数据内部。如果当前值是数组,则再次递归。考虑这个例子:

    call_user_func(function ($array, $id = 'id', $list = 'children') {
        $ul = function ($array) use (&$ul, $id, $list) {
            echo '<ul>', !array_map(function ($child) use ($ul, $id, $list) {
                echo '<li>', $child[$id], isset($child[$list]) && $ul($child[$list])
                      , '</li>';
            }, $array), '</ul>';
        };
        $ul($array);
    }, json_decode('[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},
                    {"id":2},{"id":4}]', TRUE));
    
    $json_string='[{“id”:3,“children”:[{“id”:4,“children”:[{“id”:5}]}}}、{“id”:6}、{“id”:2}、{“id”:4}];
    $array=json\u decode($json\u字符串,true);
    函数生成列表($array){
    $list='';
    foreach($key=>$value的数组){
    foreach($key=>$index的值){
    if(is_数组($index)){
    $list.=构建列表($index);
    }否则{
    $list.=“
  • $index
  • ”; } } } $list.=''; 返回$list; } echo build_列表($array);
    您正在寻找的是所谓的递归,它可以通过函数调用自身来完成

    如果在一个函数中列出列表的所有节点,则可以对所有子列表应用相同的函数。然后,这些子列表也会对其子对象执行相同的操作

    <ul>
      <li>3
        <ul>
          <li>4
            <ul>
              <li>5</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>6</li>
      <li>2</li>
      <li>4</li>
    </ul>
    

    使用可以递归遍历JSON的函数,您可以获得所需的功能。考虑下面的代码:(这只不过是列出了<代码> ID <代码>的属性,正如您希望的代码显示的)

    $json='[{“id”:3,“children”:[{“id”:4,“children”:[{“id”:5}]}},{“id”:6},{“id”:2},{“id”:4}]';
    函数createOLList($group){
    $output=(is_数组($group))?“”:“”;
    foreach($attr=>$item的组){
    if(is_数组($item)| is_对象($item)){
    $output.=createOLList($item);
    }否则{
    如果($attr==“id”){
    $output.=“
  • $item
  • ”; } } } $output.=(是数组($group))?“”:“”; 返回$output; } 打印(createOLList(json_decode($json));
    这将产生以下HTML输出

    function build_list($array) {
        $list = '<ul>';
        foreach($array as $key => $value) {
            if (is_array($value)) {
                $list .= "<strong>$key</strong>: " . build_list($value);
            } else {
                $list .= "<li><strong>$key</strong>: $value</li>";
            }
        }
        $list .= '</ul>';
        return $list;
    } 
    build_list(json_encode($json_string),true);
    
    
    
  • 三,
  • 四,
  • 五,
  • 六,
  • 二,
  • 四,

  • 我发现我必须修复或简化上面的几乎所有功能。 所以这里我带来了一些简单的,有效的,仍然是递归的东西

    函数构建列表($array){
    $list=“
      ”; foreach($key=>$value的数组){ if(是_数组($value)){ $list.=“$key:”。构建列表($value); }否则{ $list.=“
    • $key:$value
    • ”; } } $list.='
    '; 返回$list; } build_list(json_encode($json_string),true);
    您可以通过几个内置的PHP工具来实现这一点。对于初学者,使用将JSON字符串转换为PHP数组。然后,你可以用一个嵌套的
    foreach
    @DanielA.White循环它,或者在你的例子中,用一个嵌套的
    foreach
    @DanielA.White当然-我整个上午都在做这个。我将添加一些到目前为止我已经尝试过的内容。@cracketastic谢谢你的指点-我用我当前进度的一个片段更新了我的问题。我正在修改它,所以嵌套的标记代码丢失了。@ABOO欢迎您提供指针。我发布了一个答案,但我看到你已经选择了一个。无论如何,很高兴你能得到你所需要的帮助。这很好,但是,它似乎只允许一个孩子级别。我需要它去至少4。除了破解代码和添加更多循环之外,我不确定如何使用它。好的,我将编辑以允许两个子级别,但我认为其余的可以自己处理:)。它可以通过多种方式完成,你甚至可以创建一个递归函数,当一个节点有一个孩子的时候,它会用一个corespondin
  • 响应一个,这就像火箭科学代码一样!老实说,这是正确的答案,应该被接受+1否,接受的答案在代码中也有递归。然而,这也许不能很好地解释它。虽然我的代码可能没有公认的示例那么容易阅读。
    call_user_func(function ($array, $id = 'id', $list = 'children') {
        $ul = function ($array) use (&$ul, $id, $list) {
            echo '<ul>', !array_map(function ($child) use ($ul, $id, $list) {
                echo '<li>', $child[$id], isset($child[$list]) && $ul($child[$list])
                      , '</li>';
            }, $array), '</ul>';
        };
        $ul($array);
    }, json_decode('[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},
                    {"id":2},{"id":4}]', TRUE));
    
    <ul>
      <li>3
        <ul>
          <li>4
            <ul>
              <li>5</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>6</li>
      <li>2</li>
      <li>4</li>
    </ul>
    
    $json = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]';
    
    function createOLList($group) {
        $output = (is_array($group)) ? "<ol>" : "";
        foreach($group as $attr => $item) {
            if(is_array($item) || is_object($item)) {
                $output .= createOLList($item);
            } else {
                if($attr == "id") {
                    $output .= "<li>$item</li>";
                }
            }
        }
        $output .= (is_array($group)) ? "</ol>" : "";
        return $output;
    }
    
    print(createOLList(json_decode($json)));
    
    <ol>
        <li>3</li>
        <ol>
            <li>4</li>
            <ol>
                <li>5</li>
            </ol>
        </ol>
        <li>6</li>
        <li>2</li>
        <li>4</li>
    </ol>
    
    function build_list($array) {
        $list = '<ul>';
        foreach($array as $key => $value) {
            if (is_array($value)) {
                $list .= "<strong>$key</strong>: " . build_list($value);
            } else {
                $list .= "<li><strong>$key</strong>: $value</li>";
            }
        }
        $list .= '</ul>';
        return $list;
    } 
    build_list(json_encode($json_string),true);