展平数组会导致超出最大内存错误
Flattening an array results in maximum memory exceeded error
我有这个片段可以展平多维数组。
我想从函数参数生成数组并将其用作我的数据源。然而,我遇到了 Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes).
如果我将数组参数传递给函数并将其用作数据源,一切正常,但我想从函数参数中收集输入。
这是我的代码:
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];
}
你的错误信息意味着你有Whosebug,因为递归函数的不定式调用
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]]));
我有这个片段可以展平多维数组。 我想从函数参数生成数组并将其用作我的数据源。然而,我遇到了 Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes).
如果我将数组参数传递给函数并将其用作数据源,一切正常,但我想从函数参数中收集输入。
这是我的代码:
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];
}
你的错误信息意味着你有Whosebug,因为递归函数的不定式调用
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]]));