PHP非递归无限级别类别树

时间:2018-11-29 11:07:05

标签: php algorithm recursion tree

我已经搜索了如何制作类别树,并且总是使用递归来找到。但是我想知道如何在不使用递归的情况下列出类别树的列表,这可能吗?

数据:

$arrItems = array(
    array('id' => 1, 'parent_id' => 0),
    array('id' => 2, 'parent_id' => 1),
    array('id' => 3,  'parent_id' => 2),
    ...
);

输出:

<ul>
    <li> 1 
        <ul>
            <li> 3 </li>
            <li> 5 
                <ul>
                    <li> 7 </li>
                    ...
                </ul>
            </li>
        </ul>
    </li>
    <li> 2 
        ...
    </li>
</ul>

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以通过将父级关系转换为子级关系来实现。为此,您需要进行一次迭代。您可以使用此功能:

function toTree($arrItems) {
    $children = [];
    foreach($arrItems as $item) $children[$item["parent_id"]][] = $item["id"];
    return $children;
}

然后,一旦有了该数据结构,就可以使用以下函数将其转换为HTML结构:

function toHTML(&$children, $parent=0, $indent="") {
    if (!isset($children[$parent])) return ""; 
    return "$indent<ul>\n" . implode("", array_map(function($id) use ($children, $indent) {
        return "$indent  <li>$id\n" . toHTML($children, $id, "$indent    ") . "$indent  </li>\n";
    }, $children[$parent])) . "$indent</ul>\n";
}

示例用法:

$arrItems = [
    ['id' => 1, 'parent_id' => 0],
    ['id' => 2, 'parent_id' => 1],
    ['id' => 3,  'parent_id' => 2],
    ['id' => 4,  'parent_id' => 1],
];

echo toHTML(toTree($arrItems));

以上输出:

<ul>
  <li>1
    <ul>
      <li>2
        <ul>
          <li>3
          </li>
        </ul>
      </li>
      <li>4
      </li>
    </ul>
  </li>
</ul>