【问题标题】:PHP Recursive Function Breaks at ReturnPHP递归函数在返回时中断
【发布时间】:2012-01-09 17:14:34
【问题描述】:

我编写了一个递归函数,它通过查看每个员工经理来生成组织图。该函数有效,但是我遇到了返回值的问题。该代码使用两个函数,它们都是递归的。它们是使用相同的思维方式构建的。

我的问题在于函数 get_top_org,当到达第一个没有任何员工的员工时,它会跳出循环。该功能应通过为经理映射所有员工来继续。我可以通过删除递归返回(return get_top_org($emp->username, $organisation, $level, $limit);)来获得执行此操作的函数。然后该函数将遍历所有员工,但返回 null。

感谢任何帮助!

function get_top_managers($username, $account, $layer, $managers){
global $DB;

$manager = $DB->get_record('user_info_data', array('fieldid' => 2, 'userid' => (String)$account->id));
if($manager->data != ""){
    $managers[$username][] = $manager->data;
    $manager_account = $DB->get_record('user', array('username' => (String)$manager->data));
    return get_top_managers($username, $manager_account, $layer + 1, $managers);
}else{
    return $managers;
}
}

function get_top_org($username, $organisation, $level, $limit){
global $DB;

$employees = $DB->get_records_select('user_info_data', "fieldid = 2 AND data LIKE '$username'");

if(count($employees) != 0){
    foreach($employees as $emp){
        if($emp = $DB->get_record('user', array('id' => $emp->userid))){
            $managers = array();
            $last = "";

            $managers = get_top_managers($emp->username, $emp, 0, $managers);

            $managers = $managers[$emp->username];

            foreach($managers as $manager){
                $merger = array();
                if($last != ""){
                    $merger[$manager] = $last;
                    $last = $merger;
                }               
            }
            $organisation = array_merge_recursive($organisation, $merger);
                            //This return statement gets the function to stop running, however - if removed the function returns null but runs as it should. 
            return get_top_org($emp->username, $organisation, $level, $limit);
        }
    }
}else{
    if($non_manager = $DB->get_record('user', array('username' => $username))){
        $managers = array();
        $last = "";

        $managers = get_top_managers($non_manager->username, $non_manager, 0, $managers);

        $managers = $managers[$non_manager->username];

        foreach($managers as $manager){
            $merger = array();
            if($last != ""){
                $merger[$manager] = $last;
                $last = $merger;
            }else{
                $last = array($manager => $non_manager->username);
            }                   
        }
        return array_merge_recursive($organisation, $merger);
    }
}
}

【问题讨论】:

    标签: php function recursion


    【解决方案1】:

    您正在遍历一个员工列表,然后从该循环中返回。因此,您在此处编写的函数只会访问一名员工。

    您应该结合每次调用的结果并在 for 循环完成后返回,而不是直接将(递归)调用的结果返回给 get_top_org。

    【讨论】:

    • 太棒了——成功了。我会将代码发布在答案中以供其他人使用。
    猜你喜欢
    • 2013-09-21
    • 2018-02-21
    • 2012-02-23
    • 2011-05-23
    • 2012-03-11
    • 2015-04-27
    • 2020-09-05
    • 2018-01-04
    • 2021-03-02
    相关资源
    最近更新 更多