@wd-315

Как реализовать рекурсивное получение значений многомерного (древовидного) массива?

Реализовываю в одном приложении функцию просмотра отчета. Для сотрудников у которых нет подчиненных - можно посмотреть отчет только для себя, для тех у кого есть подчиненные - давать выбор посмотреть отчет по ним.
Сотрудники разбиты по отделам и у каждого отдела есть руководитель.

Пример отображения данных (в каком виде база их возвращает):

UF_HEAD - ID руководителя отдела
ID - ID отдела
PARENT - родитель отдела

[0] => Array
(
    [ID] => 1
    [NAME] => Рога и копыта
    [UF_HEAD] => 40
)

[1] => Array
(
    [ID] => 86
    [NAME] => Рога
    [PARENT] => 1
    [UF_HEAD] => 88
)

[2] => Array
(
    [ID] => 72
    [NAME] => Копыта
    [PARENT] => 1
    [UF_HEAD] => 88
)

[3] => Array
(
    [ID] => 55
    [NAME] => Рожки
    [PARENT] => 86
    [UF_HEAD] => 70
)


Я преобразую его в многомерный древовидный массив
[1] => Array
(
    [ID] => 1
    [NAME] => Рога и копыта
    [UF_HEAD] => 40
    [CHILDS] =>
    Array
    (
		[86] => Array
		(
		    [ID] => 86
		    [NAME] => Рога
		    [PARENT] => 1
		    [UF_HEAD] => 88
		    [CHILDS] => Array
		    (
				[55] => Array
				(
				    [ID] => 55
				    [NAME] => Рожки
				    [PARENT] => 86
				    [UF_HEAD] => 70
				)
		    )
		)

		[72] => Array
		(
		    [ID] => 72
		    [NAME] => Копыта
		    [PARENT] => 1
		    [UF_HEAD] => 88
		)
    )
)


И вот тут начинается главная проблема, в которой не могу разобраться:
Мне нужно как-то в каждой ветке добавить поле [CHILDS_ID] в которой будет массив ID всех нижестоящих подразделений.
Или может я что-то не так делаю - основная мысль в том, что на входе я имею ID пользователя (в таблице UF_HEAD), и мне нужно собрать все ID дочерних подразделений, где UF_HEAD родительского раздела совпадает с ID пользователя.

Грубо говоря, чтобы пользователь с ID 40, мог смотреть отчеты по всем, а с ID=88 только по отделу с ID 86 и 55.
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
0xD34F
@0xD34F
function addChildrenIds(&$arr) {
  $ids = [];

  if (is_array($arr)) {
    foreach ($arr as &$n) {
      $n['childrenIds'] = addChildrenIds($n['children']);
      array_push($ids, $n['id'], ...$n['childrenIds']);
    }
  }

  return $ids;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы