php - 从多维数组创建嵌套列表

标签 php arrays

我在 PHP 中有一个数组,如下所示:

array (
    [0] => array (
        [id] => 1
        [title] => "Title 1"
        [parent_id] => NULL
        [depth] => 0
    )
    [1] => array (
        [id] => 2
        [title] => "Title 2"
        [parent_id] => NULL
        [depth] => 0
    )
    [2] => array (
        [id] => 3
        [title] => "Title 3"
        [parent_id] => 2
        [depth] => 1
    )
    [3] => array (
        [id] => 4
        [title] => "Title 4"
        [parent_id] => 2
        [depth] => 1
    )
    [4] => array (
        [id] => 5
        [title] => "Title 5"
        [parent_id] => NULL
        [depth] => 0
    )
    [5] => array (
        [id] => 6
        [title] => "Title 6"
        [parent_id] => 4
        [depth] => 2
    )
)

我想做的是迭代这个数组并创建一个嵌套的 <ol>从中列出。所以结果应该是这样的:

<ol>
    <li>Title 1</li> // id = 1
    <li>Title 2</li> // id = 2
    <ol>
        <li>Title 3</li> // id = 3 -> parent_id = 2
        <li>Title 4</li> // id = 4 -> parent_id = 2
        <ol>
            <li>Title 6</li> // id = 6 -> parent_id = 4
        </ol>
    </ol>
    <li>Title 5</li> // id = 5
</ol>

我一直在想办法完成这项工作。但到目前为止,每次尝试都失败了......

任何人都知道我如何创建这样一个嵌套的 <ol>从这样的数组中列出?

请注意,我无法控制给定的数据。我只是调用一个 API,它返回 json 数据,我将其转换为数组。该阵列看起来与我描述的完全一样。

最佳答案

你应该使用递归:

首先是 'php' 语法中的数组:

<?php
$a=array (
    '0' => array (
        'id' => 1,
        'title' => "Title 1",
        'parent_id' => 'NULL',
        'depth' => 0
    ),
    '1' => array (
        'id' => 2,
        'title' => "Title 2",
        'parent_id' => 'NULL',
        'depth' => 0
    ),
    '2' => array (
        'id' => 3,
        'title' => "Title 3",
        'parent_id' => 2,
        'depth' => 1
    ),
    '3' => array (
        'id' => 4,
        'title' => "Title 4",
        'parent_id' => 2,
        'depth' => 1
    ),
    '4' => array (
        'id' => 5,
        'title' => "Title 5",
        'parent_id' => 'NULL',
        'depth' => 0
    ),
    '5' => array (
        'id' => 6,
        'title' => "Title 6",
        'parent_id' => 4,
        'depth' => 0
    )
);

这里是代码:

$level = 'NULL';

function r( $a, $level) {
   $r = "<ol>";
   foreach ( $a as $i ) {
       if ($i['parent_id'] == $level ) {
          $r = $r . "<li>" . $i['title'] . r( $a, $i['id'] ) . "</li>";
       }
   }
   $r = $r . "</ol>";
   return $r;
}

print r( $a, $level );

?>

结果:

<ol><li>Title 1<ol></ol></li><li>Title 2<ol><li>Title 3<ol>
</ol></li><li>Title 4<ol><li>Title 6<ol></ol></li></ol></li></ol></li><li>Title 5
<ol></ol></li></ol>
  1. 标题 1\n
    1. 标题 2\n
      1. 标题 3\n
        1. li>标题 4\n
          1. 标题 6\n
        2. 标题 5\n

          检查为解决方案后编辑

          避免空叶:

          function r( $a, $level) {
             $r = '' ;
             foreach ( $a as $i ) {
                 if ($i['parent_id'] == $level ) {
                    $r = $r . "<li>" . $i['title'] . r( $a, $i['id'] ) . "</li>";
                 }
             }
             return ($r==''?'':"<ol>". $r . "</ol>");
          }
          

          关于php - 从多维数组创建嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12771708/

          相关文章:

          php - curl_multi_exec 显示不同的运行

          javascript - 在 while 循环中从 php 变量保存脚本变量

          ios - 只向数组插入 10 个元素

          javascript - 如何将数字转换为字符串并将其用作 JavaScript 中的数组键?

          java - 循环数组队列实现 : Which is the best way to resize a circular array?

          arrays - 如何从数组中的每个元素创建对象?

          php - 是否有通过匹配多个条件来排序的 SQL 技术?

          php - 防止 session 在非事件用户的 PHP session 中过期

          php - Symfony2 角色/组 - is_granted 未检测用户拥有的角色

          Python-循环遍历未排序的数组时计算某一项的出现次数