展平数组会导致最大内存超出错误

时间:2017-06-06 13:27:15

标签: php arrays out-of-memory

我有这个片段可以展平多维数组。 我想从函数参数生成数组并将其用作我的数据源。但是我遇到允许的内存大小为134217728字节耗尽(试图分配262144字节)

但是,如果我将数组参数传递给函数并将其用作数据源,则一切正常,但我想从函数参数中收集输入。

这是我的代码:

public function flatten()
{

    $data = func_get_args();

    return is_array($data) ? array_reduce($data, function($c, $a){
        return array_merge($c, $this->flatten($a));
    }, []) : [$data];


}

1 个答案:

答案 0 :(得分:1)

您的错误消息表示您有stackoverflow,因为不断调用递归函数

public function flatten()
{

    $data = func_get_args(); 
    // $data is always array after this

    return is_array($data) ? array_reduce($data, function($c, $a){ 
    // so, you need to move this condition inside anonymous function
        return array_merge($c, $this->flatten($a)); 
        // there is you are calling function with the same argument, you need to use variadic
    }, []) : [$data];


}

编辑功能。

<?php

class Foo {

public function flatten()
{

    $data = func_get_args();

    return array_reduce($data, function($c, $a){
        return  array_merge($c, is_array($a) ?$this->flatten(...$a) : [$a]);
    }, []) ;


}

}

var_dump((new Foo())->flatten(1));
var_dump((new Foo())->flatten());
var_dump((new Foo())->flatten(1, [2], [3, [4,5]]));

https://3v4l.org/uRUpK