Я написал рекурсивную функцию, которая создает организационную диаграмму, глядя на каждого менеджера. Функция работает, однако у меня есть проблема с возвращаемыми значениями. Код использует две функции, которые являются рекурсивными. Они строятся с использованием одного и того же мышления.PHP рекурсивная функция прерывается при возврате
Моя проблема заключается в функции get_top_org, которая вырывается из цикла при получении первого сотрудника, у которого нет сотрудников. Функция должна продолжаться путем сопоставления всех сотрудников для менеджера. Я могу заставить функцию сделать это, удалив рекурсивный return (return get_top_org ($ emp-> имя пользователя, $ organization, $ 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);
}
}
}
Отлично. Это сделало трюк. Я отправлю код в ответ, который будет использоваться другими. – henrikthorn