Техника выравнивания многомерного массива по-прежнему оставляет пустые массивы - PullRequest
1 голос
/ 29 мая 2020

Есть много ссылок на S / O, в которых показаны различные методы выравнивания многомерного рекурсивного массива (с более чем двумя уровнями). Я прошел через десятки (и пробовал больше всего), но до сих пор сталкиваюсь со странной проблемой с каждым из них. В результате я получаю:

Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000043
    [1] => 1000045
    [2] => 1000050
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000030
    [1] => 1000032
    [2] => 1000058
    [3] => 1000064
) ...

Но то, что я ожидаю, это действительно сплющенный одиночный массив:

Array
    [0] => 1000043
    [1] => 1000045
    [2] => 1000050
    [3] => 1000030
    [4] => 1000032
    [5] => 1000058
    [6] => 1000064
)

Предполагается, что метод, который я нашел на S / O для обработки «пустого массива» (что, как я полагаю, является проблемой), но я все равно получаю неправильный результат. Вот мой код:

function array_flatten5(array $array)
{
    $flat = array(); // initialize return array
    $stack = array_values($array); // initialize stack
    while($stack) // process stack until done
    {
        $value = array_shift($stack);
        if (is_array($value)) // a value to further process
        {
            $stack = array_merge(array_values($value), $stack);
        }
        else // a value to take
        {
           $flat[] = $value;
        }
    }
    return $flat;
}

Может ли кто-нибудь указать, что мне здесь не хватает, потому что я думаю, что это что-то простое, но на данный момент мои глаза пересекаются с количеством попыток, которые я сделал. Спасибо за любую помощь, которую вы можете предоставить.

Вот исходный массив. Он имеет 4 уровня:

Array ( [0] => 1000043 [1] => 1000045 [2] => 1000050 ) Array ( [0] => 1000030 [1] => 1000032 [2] => 1000058 [3] => 1000064 ) Array ( [0] => 1000041 [1] => 1000059 [2] => 1000069 ) Array ( [0] => 1000021 [1] => 1000044 [2] => 1000049 [3] => 1000071 ) Array ( [0] => 1000009 [1] => 1000013 [2] => 1000015 [3] => 1000017 [4] => 1000053 ) Array ( [0] => 1000022 [1] => 1000034 [2] => 1000070 ) Array ( [0] => 1000038 [1] => 1000047 [2] => 1000055 [3] => 1000063 ) Array ( [0] => 1000019 [1] => 1000054 [2] => 1000060 [3] => 1000066 [4] => 1000068 ) Array ( [0] => 1000006 [1] => 1000014 [2] => 1000016 [3] => 1000072 ) Array ( [0] => 1000024 [1] => 1000025 [2] => 1000046 [3] => 1000061 [4] => 1000067 ) Array ( [0] => 1000028 [1] => 1000039 [2] => 1000048 ) Array ( [0] => 1000042 [1] => 1000057 ) Array ( [0] => 1000027 [1] => 1000033 [2] => 1000036 [3] => 1000037 ) Array ( [0] => 1000008 [1] => 1000010 [2] => 1000012 [3] => 1000018 ) Array ( [0] => 1000026 [1] => 1000062 [2] => 1000065 ) Array ( [0] => 1000020 [1] => 1000023 [2] => 1000031 [3] => 1000035 [4] => 1000040 ) Array ( [0] => 1000007 [1] => 1000011 [2] => 1000029 ) Array ( [0] => 1000051 [1] => 1000052 [2] => 1000056 ) Array ( [0] => 1000001 [1] => 1000002 [2] => 1000003 [3] => 1000004 [4] => 1000005 ) Array ( [0] => 1000073 )

И вот результат с использованием предложения array_walk_recursive ...

Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000111
    [1] => 1000113
    [2] => 1000129
    [3] => 1000134
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000012
    [1] => 1000085
)
Array
(
) ...

1 Ответ

0 голосов
/ 30 мая 2020

Вы не подготовили подходящий массив, но, глядя на этот код, вам, вероятно, понадобится функция array_walk_recursive().

$array = [
    [1, 2, 3, 4],
    [[5, 6], [7, 8]],
    [[[9], [10]], [11]]
];

$result = [];
array_walk_recursive($array, function ($tempV) use (&$result) {
    $result[] = $tempV;
});

print_r($result);

Вывод:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
)
...