concat tree hierarchie在递归PHP函数中

时间:2017-01-22 16:45:02

标签: php recursion tree

我有一个带有分层用户的用户表。因此用户可以拥有父用户。我试图返回某个用户的所有子用户ID的数组。 我的函数返回“null”。怎么了?

public function userDownline($userid, $result = array()) {
    $dbconn = $this->DBase();
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid);
    if(count($children) > 0) {
        foreach($children As $k=>$v) {
            if(!in_array($v['id'], $result)) $result[] = $v['id'];
            $this->userDownline($v['id'], $result);
        }
    } else {
        return $result;
    }
}    

1 个答案:

答案 0 :(得分:1)

当然它会返回null,因为你在块if(count($ children))并且没有返回。

我认为你必须做这样的事情:

<?php
public function userDownline($userid, &$result = array())
{
    $dbconn = $this->DBase();
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid);
    if (count($children) > 0) {
        foreach ($children As $k => $v) {
            if (!in_array($v['id'], $result)) $result[] = $v['id'];
            $this->userDownline($v['id'], $result);
        }
    }
    return $result;
}

我在函数签名中添加了引用,并将条件块中的返回移出。

但这实际上是完全低效的方式和危险(因为 - 内存不足,嵌套级别太多和其他异常)。

有两种更好的方法:

  1. 使用https://neo4j.com/ - 图表数据库 - 您的任务的最佳选择。
  2. 如果您仍想使用Sql DB - 请阅读嵌套集模型 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/