Как получить всех подчиненных? 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);
→ Ссылка