我有这个多维数组
$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 :(得分:1)
代码的问题是,当您要使用array_merge
时,会将to_array
的结果推送到$out
中。现在,由于这需要两个参数都为数组,因此当$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 :(得分:1)
array_walk_recursive()
通过单线不确定深度的数组提供期望的结果,因为它仅访问“叶节点”-有效地,您无需费心检查元素是否为不是数组。
array_walk_recursive()
不返回数组,而是基于是否失败而返回true
| false
。
&$flat
是一个“通过引用传递”的变量。这意味着$flat
可以充当将数据从功能范围内部传输到功能范围外部的工具。遍历元素时,每个新值都使用方括号语法推入$flat
中。
这正是此功能最出色的地方-使用它。
代码:(Demo)
$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,
)