За последние 24 часа нас посетили 70366 программистов и 5688 роботов. Сейчас ищут 1226 программистов ...

Сортировка массива бесконечной вложенности

Тема в разделе "Сделайте за меня", создана пользователем grafillo, 4 мар 2023.

  1. grafillo

    grafillo Новичок

    С нами с:
    4 мар 2023
    Сообщения:
    6
    Симпатии:
    0
    Был на собесе дали задание сделать сортировку массива бесконечной вложенности
    Суть задачи в том что есть массив
    Код (Text):
    1. $array = [
    2.     ['id'=>1,'name'=>'director','parent_id'=>null],
    3.     ['id'=>2,'name'=>'уборщца','parent_id'=>1],
    4.     ['id'=>3,'name'=>'нач отдела','parent_id'=>1],
    5.     ['id'=>4,'name'=>'сотрудник','parent_id'=>3],
    6. ];
    привести его к виду
    Код (Text):
    1.  
    2. $array = [
    3.               ['id'=>1,'name'=>'director','parent_id'=>null,
    4.              'children'=>[      
    5.                        ['id'=>2,'name'=>'уборщца','parent_id'=>1,'children'=>[]],
    6.                        ['id'=>3,'name'=>'нач отдела','parent_id'=>1,'children'=>[
    7.                                                     ['id'=>4,'name'=>'сотрудник','parent_id'=>3, 'children'=>[]]
    8.                                                                                 ]
    9.                        ]
    10.                     ]
    11.                 ]
    12.             ];
    Причём детей может быть бесконечно много друг под другом как и директоров которые должны быть на одном уровне. В лучших традиция я сделал вложенным форичем что не позволило реализовать до конца задачу, он показал как надо но я мысль не уловил, там вообщем делается через карту массива и с помощью ссылок, кто может помочь реализовать это вот всё?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Ты называешь преобразование в другой вид "сортировкой"?

    Тут напрашивается рекурсивная функция, которая ищет всех детей для текущего узла и обращается сама к себе чтобы найти детей этих детей и т.д.
    Конечно, любую рекурсию можно развернуть в итерацию, но рекурсия красивей и наглядней. ;)

    Удачи!
    --- Добавлено ---
    google recursive function to translate adjacency list to nested array
     
  3. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Без рекурсии.

    PHP:
    1. $array = [
    2.     ['id'=>1,'name'=>'director','parent_id'=>null],
    3.     ['id'=>2,'name'=>'уборщца','parent_id'=>1],
    4.     ['id'=>3,'name'=>'нач отдела','parent_id'=>1],
    5.     ['id'=>4,'name'=>'сотрудник','parent_id'=>3],
    6. ];
    7.  
    8. $data = array_combine(array_column($array, 'id'), $array);
    9.  
    10. $treeResult = buildTree($data, 'parent_id');
    11.  
    12. echo "<pre>";
    13. var_export($treeResult);
    14. echo "</pre>";
    15.  
    16.  
    17. function buildTree(array $data, string $field): array
    18. {
    19.     $arr = [];
    20.     foreach ($data as $key => &$node) {
    21.         if (!array_key_exists($node[$field], $data)) {
    22.             $arr[$key] = &$node;
    23.         } else {
    24.             $data[$node[$field]]['childs'][$key] = &$node;
    25.         }
    26.     }
    27.     return $arr;
    28. }
     
    #3 Aleksandr.B, 5 мар 2023
    Последнее редактирование: 5 мар 2023
    artoodetoo нравится это.