Php 递归展平多维数数组
假设我有一个这样的数组Php 递归展平多维数数组,php,arrays,recursion,Php,Arrays,Recursion,假设我有一个这样的数组 Array ( [0] => 123 [180] => Array ( [400] => Array ( [0] => 474 [1] => 395 [2] => 994 [3] => 365 ) ) [1] => 144 [2] =&
Array
(
[0] => 123
[180] => Array
(
[400] => Array
(
[0] => 474
[1] => 395
[2] => 994
[3] => 365
)
)
[1] => 144
[2] => 119
)
我想遍历这个数组并生成一个包含所有数字的一维数组。在循环中,如果我们得到一个数组,那么这个数字就是对应的数组键
我做了类似的事情,但不起作用:
function flatten_array($data) {
$result = array();
foreach ($data as $key => $value) {
if(is_array($value)) {
$result[] = $key;
flatten_array($value);
} else {
$result[] = $value;
}
}
return $result;
}
我应该得到的结果数组应该是:
$result = Array
(
[0] => 123
[1] => 180
[2] => 400
[3] => 474
[4] => 395
[5] => 994
[6] => 365
[7] => 144
[8] => 119
)
感谢您的帮助。composer中有一些有用的库,例如: 使用此库,您可以按以下方式展平数据:
$result=toArray(展平($data));
无需使用库,可通过以下方式实现此结果:
函数数组(数组$data){
$values=数组_值($data);
$result=[];
foreach($value作为$value){
if(是_数组($value)){
$result=array\u merge(flattarray($value),$result);
}否则{
$result[]=$value;
}
}
返回$result;
}
请注意您原始示例中的错误:
$result[]=$key;
展平数组($value);
调用递归函数时不使用其返回的结果。
您可以分配密钥。您的代码不会在任何地方累积结果。您可以返回数组并合并它们,但为了节省分配开销,我建议使用单个结果数组并通过引用将其传递到递归walk函数中。下面是一个完整的示例:
function flatten_array($a) {
function flatten($a, &$flat) {
foreach ($a as $k => $v) {
if (is_array($v)) {
$flat[] = $k;
flatten($v, $flat);
}
else {
$flat[] = $v;
}
}
}
$flat = [];
flatten($a, $flat);
return $flat;
}
$a = [
123,
180 => [
400 => [
474,
395,
994,
365,
]
],
144,
119
];
print_r(flatten_array($a));
如果你期望你的深度是巨大的,你可以迭代来避免溢出。请注意,这提供了广度优先排序:
function flatten_array($a) {
$flat = [];
for ($stack = [$a]; count($stack);) {
foreach (array_pop($stack) as $k => &$v) {
if (is_array($v)) {
$flat[] = $k;
$stack[] = $v;
}
else {
$flat[] = $v;
}
}
}
return $flat;
}
您可以使用下一个递归函数:
function array_flat($arr) {
$res = [];
foreach($arr as $key=>$val) {
if (is_array($val)) {
// element is array: Push key to result and merge recursion result
array_push($res, $key);
$res = array_merge($res, array_flat($val));
} else {
// push simple value to result
array_push($res, $val);
}
}
return $res;
}
print_r(array_flat($arr));
谢谢,但我知道这不需要使用任何库就可以完成。这不起作用。当我们有子数组时,不会返回数组键。这些答案之一解决了您的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标记答案,最好地解决了你的问题接受。