У меня есть этот многомерный массив
$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;
}
где проблема в этой рекурсивной функции !!!
Проблема с вашим кодом заключается в том, что вы выдвигаете результат 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,
)
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,
)