Как написать код который распределяет массивы?

Есть массив:
Array(
      [9] => Array(
                     [id] => 9
                     [content] => 4
                     [pos] => 0
                     [fname] => pack
                     [playlist] => Array()
                     )
      [11] => Array(
                     [id] => 11
                     [content] => 4
                     [pos] => 9
                     [fname] => LOL
                     [folder] => pack
                     [folderID] => Array(
                                           [0] => 9
                                        )
                     )
      [13] => Array(
                      [id] => 13
                      [content] => 4
                      [pos] => 11
                      [fname] => MAZ
                      [folder] => pack:LOL
                      [folderID] => Array(
                                           [0] => 9
                                           [1] => 11
                                         )
                      [playlist] => Array()
         )
)

folderID - это путь в котором должен располагаться массив.
[pos] => 0 - корень массива
Помогите написать код который распределяет все массивы.
Должно получится так (вот):
Array(
      [9] => Array(
                     [id] => 9
                     [content] => 4
                     [pos] => 0
                     [fname] => pack
                     [playlist] => Array(
                                       [11] => Array(
                                                     [id] => 11
                                                     [content] => 4
                                                     [pos] => 9
                                                     [fname] => LOL
                                                     [folder] => pack
                                                     [folderID] => Array(
                                                                        [0] => 9
                                                                        )
                                                     [playlist] => Array(
                                                                           [13] => Array(
                                                                                       [id] => 13
                                                                                       [content] => 4
                                                                                       [pos] => 11
                                                                                       [fname] => MAZ
                                                                                       [folder] => pack:LOL
                                                                                       [folderID] => Array(
                                                                                                           [0] => 9
                                                                                                           [1] => 11
                                                                                                           )
                                                                                       [playlist] => Array()
                                                                             )
                                                      )
                                        )
                     )
        )
)


Начальный массив может иметь много элементов, соответственно код должен быть универсальным.
  • Вопрос задан
  • 2417 просмотров
Решения вопроса 1
@iamnothing
Вот как-то так.
function rebuild(array $array) {
    $count_children = [];
    $without_children = [];

    foreach ($array as $id => $element) {
        // инициализация подсчета дочерних элементов, если это еще не было сделано
        if (!isset($count_children[$id])) {
            $count_children[$id] = 0;
        }

        if ($count_children[$id] === 0) {
            $without_children[] = $id;
        }

        if ($element['pos'] === 0) {
            continue;
        }

        // инкремент кол-ва дочерних элементов для родительского эл-та
        if ( !isset($count_children[$element['pos']]) ) {
            $count_children[$element['pos']] = 0;
        }
        $count_children[$element['pos']]++;

        // удаление родительского эл-та из списка "бездочерних" элементов
        if (($key = array_search($element['pos'], $without_children)) !== false) {
            unset($without_children[$key]);
        }
    }

    while(!empty($without_children)) {
        foreach ($without_children as $key => $id) {
            $parent_id = $array[$id]['pos'];

            if ($parent_id !== 0) {
                if (!isset($array[ $parent_id ]['playlist'])) {
                    $array[ $parent_id ]['playlist'] = [];
                }
                $array[$parent_id]['playlist'][] = $array[$id];

                unset($array[$id]);

                $count_children[$parent_id]--;
                if ($count_children[$parent_id] <= 0 && $parent_id !== 0) {
                    $without_children[] = $parent_id;
                }
            }
            unset($without_children[$key]);
        }
    }

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

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

Войти через центр авторизации
Похожие вопросы
Технология Тюмень
от 50 000 до 130 000 ₽
АКМЭ сервис Санкт-Петербург
от 120 000 до 150 000 ₽
04 авг. 2020, в 08:36
2000 руб./за проект
04 авг. 2020, в 06:54
5000 руб./за проект
04 авг. 2020, в 03:17
1000 руб./за проект