创建树结构所需的 PHP 递归帮助

标签 php mysql codeigniter recursion

这是我的表结构:

CREATE TABLE menu (
  menuid int(11) NOT NULL AUTO_INCREMENT,
  menuname varchar(100) NOT NULL DEFAULT '',
  menulink varchar(100) NOT NULL DEFAULT '',
  menuparentId int(11) NOT NULL DEFAULT '0',
  menuhasChild smallint(1) NOT NULL DEFAULT '0',
  menustatus smallint(1) NOT NULL DEFAULT '1',
  menuorder int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (menuid)
)

我正在使用递归函数由此创建菜单结构,但在这里失败了:

function categoriesTree($id=0){    
    $s = "SELECT * FROM menu  WHERE menuparentId = '".$id."' 
        ORDER BY menuorder, menuid ";
    $rid = $this->db->query($s)->result_array();
    $treeArray = array();
    foreach($rid as $row){
        $treeArray[$row['menuid']] = $row;
        if($row['menuhasChild']==1){
            $treeArray[$row['menuid']] = $this->categoriesTree(); //results in Fatal error: Maximum function nesting level of '100' reached, aborting!
        }
    }
 retrun $treeArray;
 }

此方法是 CodeIgniter 模型类中模型的一部分。有没有更好的方法来创建树?

最佳答案

是的,有更好的方法。所谓修正的先序树遍历算法。您可以通过谷歌搜索找到大量信息,而且我确信堆栈溢出也是如此。

好处是您可以仅使用 1 个查询来获取整个子树。 SELECTS 会很快,但修改会更重。

关于创建树结构所需的 PHP 递归帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961377/

相关文章:

php - 代码点火器缓存?

javascript - 如何在 View 之间来回维护代码点火器php中的文件读取指针?

php - Firefox 在下载文件名中包含空格时出现问题

php - Symfony2 : routing with controller as a service not working

php - 如何在 php 中获取多个选中(动态)复选框的值?

PHP 更新数据库失败

javascript - 将数据库值加载为 k :v pairs into PHP,,然后加载到 JavaScript 数组中

php - 检索嵌入文档

php - 使用不同的 SQL 查询多次重复此 MySQL 到 CSV

php - 如何连续显示元素(即每行 5 个元素)