Как получить всех подчиненных? Php
Есть массив:
Array
(
[0] => Array
(
[id] => 5
[name] => Сотрудник5
[parent_id] => 0
)
[1] => Array
(
[id] => 6
[name] => Сотрудник6
[parent_id] => 5
)
[2] => Array
(
[id] => 2
[name] => Сотрудник2
[parent_id] => 1
)
[3] => Array
(
[id] => 1
[name] => Сотрудник1
[parent_id] => 4
)
[4] => Array
(
[id] => 4
[name] => Сотрудник4
[parent_id] => 3
)
[5] => Array
(
[id] => 3
[name] => Сотрудник3
[parent_id] => 6
)
[6] => Array
(
[id] => 8
[name] => Сотрудник8
[parent_id] => 6
)
[7] => Array
(
[id] => 9
[name] => Сотрудник9
[parent_id] => 6
)
)
Как мне получить Id всех подчиненных сотрудников Сотрудника6 в виде массива [2,1,4,3,8,9]? Спасибо всем за любую помощь.
Ответы (2 шт):
Автор решения: Максим Степанов
→ Ссылка
У меня, возможно, мысль уже пошла криво и можно сделать проще, но сейчас только такое решение быстро пришло в голову:
$employees = array
(
'0' => array
(
'id' => 5,
'name' => 'Сотрудник5',
'parent_id' => 0
),
'1' => array
(
'id' => 6,
'name' => 'Сотрудник6',
'parent_id' => 5
),
'2' => array
(
'id' => 2,
'name' => 'Сотрудник2',
'parent_id' => 1
),
'3' => array
(
'id' => 1,
'name' => 'Сотрудник1',
'parent_id' => 4
),
'4' => array
(
'id' => 4,
'name' => 'Сотрудник4',
'parent_id' => 3
),
'5' => array
(
'id' => 3,
'name' => 'Сотрудник3',
'parent_id' => 6
),
'6' => array
(
'id' => 8,
'name' => 'Сотрудник8',
'parent_id' => 6
),
'7' => array
(
'id' => 9,
'name' => 'Сотрудник9',
'parent_id' => 6
)
);
// приводим ключи массива в соответствие с id работника
$normilized_array = array();
foreach ($employees as $employee) {
$normilized_array[$employee['id']] = $employee;
}
// создаем дерево
$tree = array();
foreach($normilized_array as $id =>& $data){
if($data['parent_id'] == 0){
$tree[$id] =& $data;
} else {
$normilized_array[$data['parent_id']]['childes'][$data['id']] =& $normilized_array[$id];
}
}
// метод для печати всех подчиненных
function print_childes($employee_id, $arr, $is_child){
foreach ($arr as $employee) {
if($is_child){
echo $employee['id'] . ', ';
}
if($employee['id'] == 6){
$is_child = true;
}
if(isset($employee['childes'])){
print_childes($employee_id, $employee['childes'], $is_child);
}
}
}
print_childes(6, $tree, false); // 3, 4, 1, 2, 8, 9,
Автор решения: Nikita Umnov
→ Ссылка
<?php
$array = [
[
'id' => 5,
'name' => 'Сотрудник5',
'parent_id' => 0
],
[
'id' => 6,
'name' => 'Сотрудник6',
'parent_id' => 5
],
[
'id' => 2,
'name' => 'Сотрудник2',
'parent_id' => 1
],
[
'id' => 1,
'name' => 'Сотрудник1',
'parent_id' => 4
],
[
'id' => 4,
'name' => 'Сотрудник4',
'parent_id' => 3
],
[
'id' => 3,
'name' => 'Сотрудник3',
'parent_id' => 6
],
[
'id' => 8,
'name' => 'Сотрудник8',
'parent_id' => 6,
],
[
'id' => 9,
'name' => 'Сотрудник9',
'parent_id' => 6,
],
];
function walker($array, $parent) {
$r = [];
foreach ($array as $item) {
if (isset($item["parent_id"]) && $item["parent_id"] === $parent) {
$r = array_merge($r, [$item], walker($array, $item["id"]));
}
}
return $r;
}
$result = array_map(function ($item) {
return $item["id"];
}, walker($array, 6));
print_r($result);