Это похоже на выравнивание массива. Если вас не беспокоит память, вы можете использовать исходный массив в следующей форме:
$array = ['1', '2', '3', ['6', '6'], '4'];
А затем используйте RecursiveIteratorIterator
:
function flatArray1($array): iterator
{
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach ($iterator as $item) {
yield $item;
}
}
print_r(iterator_to_array(flatArray1($array)));
Если вы хотите использовать меньше памяти, вы можете использовать своего рода архивированную версию исходного массива:
$array = ['1', '2', '3', [2, '6'], '4'];
function flatArray2($array): iterator
{
foreach ($array as $item) {
if (is_array($item)) {
[$count, $item] = $item;
while ($count) {
yield $item;
$count -= 1;
}
continue;
}
yield $item;
}
}
print_r(iterator_to_array(flatArray2($array)));
Вот демо .