многомерный массив в одномерный массив рекурсивно

У меня есть этот многомерный массив

$liste = [[1,2,3],5,[['x','y','z'],true]];

и я хочу изменить его на один массив измерений

$liste = [1,2,3,5,'x','y','z',true];

так что у меня всегда есть проблема, которая дает мне ту же форму

function to_array($list){
$out=[];
if(!is_array($list)){
return $list;
}else{
foreach($list as $line){
$out[]= to_array($line);
}
}
return $out;
}

где проблема в этой рекурсивной функции !!!

0

Решение

Проблема с вашим кодом заключается в том, что вы выдвигаете результат to_array в $out, когда то, что вы хотите сделать, это использовать array_merge. Теперь, поскольку это требует, чтобы оба параметра были массивами, когда $list не является массивом, вам нужно вернуть массив, содержащий индивидуальное значение. Так что поменяйте эти строки:

    return $list;
$out[]= to_array($line);

Для того, чтобы:

    return array($list);
$out = array_merge(to_array($line));

то есть

function to_array($list){
$out=[];
if(!is_array($list)){
return array($list);
}else{
foreach($list as $line){
$out = array_merge($out, to_array($line));
}
}
return $out;
}

И вы получите желаемый результат:

var_export(to_array($liste));

Выход:

array (
0 => 1,
1 => 2,
2 => 3,
3 => 5,
4 => 'x',
5 => 'y',
6 => 'z',
7 => true,
)
1

Другие решения

array_walk_recursive() доставляет желаемый результат из массива неопределенной глубины в одной строке, поскольку он посещает только «листовые узлы» — фактически вам не нужно беспокоиться о проверке, является ли элемент массивом или нет.

array_walk_recursive() не возвращает массив, он возвращает true|false на основании того, был ли сбой.

&$flat переменная, которая «передается по ссылке». Это означает, что $flat может выступать в качестве транспортного средства для передачи данных изнутри области действия функции за пределы области действия функции. По мере прохождения элементов каждое новое значение помещается в $flat используя синтаксис квадратной скобки.

Это именно то, что эта функция делает лучше всего — используйте ее.

Код: (демонстрация)

$liste = [[1, 2, 3], 5, [['x', 'y', 'z'], true]];
array_walk_recursive($liste, function($v) use (&$flat){ $flat[] = $v; });
var_export($flat);

Выход:

array (
0 => 1,
1 => 2,
2 => 3,
3 => 5,
4 => 'x',
5 => 'y',
6 => 'z',
7 => true,
)
1

По вопросам рекламы [email protected]