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

时间:2014-05-19 13:34:12

标签: php html json

我正在为一个宠物项目开发一个简单的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的新手。期待收到你的回复。

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

<ol>
<?php
$json = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]';
$decoded = json_decode($json);
$pages = $decoded;
foreach($pages as $page){
   $subpages = $decoded->children;
      echo "<li>".$page->id."</li>";
    foreach($subpages as $subpage){
        echo "<li>".$subpage->id."</li>";
   }
}
?>
</ol>

5 个答案:

答案 0 :(得分:3)

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

$json_string = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]';
$array = json_decode($json_string, true);

function build_list($array) {
    $list = '<ol>';
    foreach($array as $key => $value) {
        foreach($value as $key => $index) {
            if(is_array($index)) {
                $list .= build_list($index);
            } else {
                $list .= "<li>$index</li>";
            }
        }
    }

    $list .= '</ol>';
    return $list;
}

echo build_list($array);

答案 1 :(得分:2)

您正在寻找的内容称为递归,可以通过调用自身的函数来完成。

如果您解决了一次列出一个函数中列表的所有节点,则可以对所有子列表应用相同的函数。那时候那些儿童名单也会对他们的孩子也这样做。

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函数在列表和所有子项上递归调用。还有其他解决方案,但大多数情况下,递归是一种简单的方法,可以在您绕过它时完成工作。

演示:https://eval.in/153471;输出(美化):

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

答案 2 :(得分:2)

使用可以递归遍历JSON的函数,您可以获得所需的功能。请考虑以下代码:(这只会将id的属性列为已列出的属性,如您所需的代码所示)

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

这将产生以下HTML输出。

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

答案 3 :(得分:0)

<?php

$json_array = array();

array_push($json_array, array(
    'id' => 3,
    'children' => array(
        'id'        =>  4,
        'children'  =>  array(
                'id'    =>  5,
            )
        )
));

array_push($json_array, array('id' => 6));
array_push($json_array, array('id' => 2));
array_push($json_array, array('id' => 4));

//your json object
$json_object = json_encode($json_array);
//echo $json_object;

//here is where you decode your json object
$json_object_decoded = json_decode($json_object,true);

//for debug to see how your decoded json object looks as an array
/*
echo "<pre>";
    print_r($json_object_decoded);
echo "</pre>";
*/

echo "<ol>";
foreach($json_object_decoded as $node){
    if(isset($node['id'])){
        echo "<li>" . $node['id'];
        if(isset($node['children'])){
                echo "<ol>";
                    echo "<li>" . $node['children']['id'] . "</li>";
            if(isset($node['children'])){
                echo "<ol>";
                    echo "<li>" . $node['children']['children']['id'] . "</li>";
                echo "</ol>";
            }
            echo "</ol>";
        }
        echo "</li>";
    }
}
echo "</ol>";


?>

答案 4 :(得分:0)

我发现我必须修复或简化上述几乎所有功能。 所以在这里,我带来了一些简单且可行的方法,但仍然可以递归。

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