Формирование обычного массива из рекурсивно вложенного

03 Декабря 2022 01:49

Это решение подойдет в тех случаях, когда нужно из многомерного массива вытащить все вложенные массивы и сделать их первого уровня. Например, когда была получена древовидная структура каких-либо данных. Пример:

[
  0 => [
    "id" => 19,
    "parent_id" => 12,
    "title" => "Test title 1",
    "children" => []
  ],
  1 => [
    "id" => 23,
    "parent_id" => 12,
    "title" => "Test title 2",
    "children" => [
      0 => [
        "id" => 44,
        "parent_id" => 23,
        "title" => "test subtitle 1",
        "children" => [
          0 => [
            "id" => 56,
            "parent_id" => 44,
            "title" => "test subtitle 2"
          ],
          1 => [
            "id" => 57,
            "parent_id" => 44,
            "title" => "test subtitle 3"
          ],
        ]
      ]
    ]
  ],
  2 => [
    "id" => 43,
    "parent_id" => 12,
    "title" => "Test title 3",
    "children" => []
  ]
]

В неём мы видим: вложенные массивы с испольованием ключа children, а также пустые children в уже имеющихся массивах первого уровня.

Делаем из них массивы первого уровня с помощью функции:

function normalizeArray(array $array = []): array
{
    static $out = [];

    foreach ($array as $subArray) {
        if (!empty($subArray['children'])) {
            $arrayToAdd = $subArray;
            unset($arrayToAdd['children']);

            $out[] = $arrayToAdd;
            normalizeArray($subArray['children']);
        } else {
            if (isset($subArray['children'])) {
                unset($subArray['children']);
            }

            $out[] = $subArray;
        }
    }

    return $out;
}

Также будут убраны ключи children.

Результат

[
    0 => [
        "id" => 19,
        "parent_id" => 12,
        "title" => "Test title 1",
    ],
    1 => [
        "id" => 23,
        "parent_id" => 12,
        "title" => "Test title 2",
    ],
    2 => [
        "id" => 44,
        "parent_id" => 23,
        "title" => "test subtitle 1",
    ],
    3 => [
        "id" => 56,
        "parent_id" => 44,
        "title" => "test subtitle 2"
    ],
    4 => [
        "id" => 57,
        "parent_id" => 44,
        "title" => "test subtitle 3"
    ],
    5 => [
        "id" => 43,
        "parent_id" => 12,
        "title" => "Test title 3",
    ]
];