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));

谢谢,但我知道这不需要使用任何库就可以完成。这不起作用。当我们有子数组时,不会返回数组键。这些答案之一解决了您的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标记答案,最好地解决了你的问题接受。