2012-01-09 4 views
1

Я написал рекурсивную функцию, которая создает организационную диаграмму, глядя на каждого менеджера. Функция работает, однако у меня есть проблема с возвращаемыми значениями. Код использует две функции, которые являются рекурсивными. Они строятся с использованием одного и того же мышления.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); 
    } 
} 
} 

ответ

0

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

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

+0

Отлично. Это сделало трюк. Я отправлю код в ответ, который будет использоваться другими. – henrikthorn

Смежные вопросы