I have this snippet that flattens a multi-dimensional array. I want to generate the arrays from the function arguments and use it as my data source. I however runs into Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes).
If I however passes an array parameter to the function and use it as the data source everything works normal, but I want to gather the inputs from the function arguments.
Here is my code:
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];
}
Your error message means that you have stackoverflow because infinitive calling of recursion function
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];
}
Edited function.
<?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]]));