我已经搜索了如何制作类别树,并且总是使用递归来找到。但是我想知道如何在不使用递归的情况下列出类别树的列表,这可能吗?
数据:
$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>
谢谢。
答案 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>