多维数组递归到一维数组
multidimensional array to one dimensional array recursively
我有这个多维数组
$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 一个包含单个值的数组。所以更改这些行:
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()
在一行中从不确定深度的数组中提供所需的结果,因为它只访问 "leaf-nodes" —— 实际上,您不需要费心检查元素是否是或不是数组。
array_walk_recursive()
不是 return 数组,它 returns true
|false
基于是否有失败。
&$flat
是一个变量"passed by reference"。这意味着 $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,
)
我有这个多维数组
$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 一个包含单个值的数组。所以更改这些行:
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()
在一行中从不确定深度的数组中提供所需的结果,因为它只访问 "leaf-nodes" —— 实际上,您不需要费心检查元素是否是或不是数组。
array_walk_recursive()
不是 return 数组,它 returns true
|false
基于是否有失败。
&$flat
是一个变量"passed by reference"。这意味着 $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,
)