通过引用重新设置多维数组中的数组键,递归

时间:2016-11-14 10:06:14

标签: php arrays multidimensional-array

我想在一个大的多维数组中重置键。我已经找到了一个实际工作的解决方案:

$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)
  }
}

2 个答案:

答案 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);
};