【问题标题】:PHP Non-Recursive Unlimited Level Category TreePHP非递归无限级别类别树
【发布时间】:2018-11-29 11:07:04
【问题描述】:

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

数据:

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

提前致谢。

【问题讨论】:

  • 你能添加你的递归解决方案吗?
  • 是的,这是可能的。您可以创建自己的堆栈并实现它。

标签: php algorithm recursion tree


【解决方案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>

【讨论】:

  • 非常感谢。但是你能解释一下“&$variable”是如何工作的吗?
  • 就是让它成为一个参考参数。在这种情况下,它也可以在没有&amp; 的情况下工作,但是 PHP 会将作为参数传递的数组复制到(新的)函数参数变量中。而对于&amp;,参数变量实际上是对作为参数传递的数组的引用——因此无需复制。见Passing by Reference
  • 还有一个问题,不使用参考参数是否可以做到?
猜你喜欢
  • 2012-03-18
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
相关资源
最近更新 更多