我想在一个大的多维数组中重置键。我已经找到了一个实际工作的解决方案:
$fix_keys = function(array $array) use (&$fix_keys)
{
foreach($array as $k => $val)
{
if (is_array($val))
{
$array[$k] = $fix_keys($val);
}
}
return array_values($array);
};
问题是,如果我将大数组传递给它,它会变得很慢并且消耗内存。如何使用工作引用进行重构:
$fix_keys = function(array &$array) use (&$fix_keys)
{
foreach($array as $k => &$val)
{
if (is_array($val))
{
$array[$k] = $fix_keys($val);
}
}
unset($val);
$array = array_values($array);
};
但它搞砸了数组,我得到的只是[0] => null
。有什么问题?
编辑:输入数据:
$a = [
'a' => 1,
'b' => 2,
'c' => [
'aa' => 11,
'bb' => [
'ccc' => 1
],
'cc' => 33
]
];
我希望:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
array(3) {
[0]=>
int(11)
[1]=>
array(1) {
[0]=>
int(1)
}
[2]=>
int(33)
}
}
答案 0 :(得分:1)
如果内存有问题,您可以尝试使用yield
。我不确定这是否符合您的需求,但现在是:
function reduce($array){
foreach($array as $key => $value){
if(is_array($value)){
reduce($value);
}
}
yield array_values($array);
}
如果您需要将某些逻辑应用于生成器,也可以使用send
。
答案 1 :(得分:0)
我找到了解决方案:
$fix_keys = function(array &$array) use (&$fix_keys)
{
foreach(array_keys($array) as $k)
{
if (is_array($array[$k]))
{
$fix_keys($array[$k]);
}
}
$array = array_values($array);
};