php - рекурсивная функция в таблице иерархии - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь из таблицы с иерархией отделов, получить все дочерние элементы из указанного c отца отдела.

таблица

id | id_department | id_department_manager
 1         15              12
 2          4              15
 3         33              15
 4         27              33
 5         12              12

рекурсивный функция

function recursive (array $elements) {

   $arr = $elements;

   foreach ($arr as $value) {
      $departments = DepartmenstDependencies::find()->where(['id_department_manager' => $value])->all();
   }

   foreach ($departments as $department) {
       $arr[] = $department->id_department;
       $arr = recursive($arr);
   }

   return $arr;
}

recursive([12]);

цель, например, когда я звоню recursive([15]) правильный возврат Array ( [0] => 15 [1] => 4 [2] => 33 [3] => 27 ) это нормально.

но когда я звоню recursive([12]) правильный вывод Array ( [0] => 12 [1] => 15 [2] => 4 [3] => 33 [4] => 27 ) но я получаю бесконечное l oop, это потому, что последняя строка в таблице 5, 12, 12 но как мне это предотвратить? эта рекурсивная функция верна?

1 Ответ

1 голос
/ 28 февраля 2020

Хороший тест. Я полагаю, вы не хотите, чтобы возвращаемый массив содержал дубликаты. Заменить

foreach ($departments as $department) {
    $arr[] = $department->id_department;
    $arr = recursive($arr);
}

на

foreach ($departments as $department) {
    if (!in_array($department->id_department, $arr)) {
        $arr[] = $department->id_department;
        $arr = recursive($arr);
    }
}
...