Рекурсивные PHP-функции перерываются при возврате - PullRequest
1 голос
/ 09 января 2012

Я написал рекурсивную функцию, которая генерирует организационную диаграмму, рассматривая каждого сотрудника менеджера.Функция работает, однако у меня есть проблема с возвращаемыми значениями.Код использует две функции, которые обе являются рекурсивными.Они построены с использованием одного и того же мышления.

Моя проблема заключается в функции get_top_org, которая выходит из цикла при переходе к первому сотруднику, у которого нет сотрудников.Функция должна продолжаться путем сопоставления всех сотрудников для менеджера.Я могу заставить функцию сделать это, удалив рекурсивный возврат (return get_top_org ($ emp-> username, $ organization, $ level, $ limit);).Затем функция пройдет через всех сотрудников, но вернет ноль.

Любая помощь приветствуется!

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);
    }
}
}

1 Ответ

0 голосов
/ 09 января 2012

Вы просматриваете список сотрудников, но затем возвращаетесь из этого цикла. Таким образом, функция, как вы написали здесь, будет посещать только одного сотрудника.

Вместо того, чтобы возвращать результаты вашего (рекурсивного) вызова в get_top_org напрямую, вы должны объединить результаты каждого вызова и вернуть его после завершения цикла for.

...