【问题标题】:How can I reindex a multi-dimensional array?如何重新索引多维数组?
【发布时间】:2012-08-23 12:41:08
【问题描述】:

我正在使用这个函数来计算2个多维数组之间的差异:

/**
 * http://www.php.net/manual/en/function.array-diff.php#91756
 * @param $array1
 * @param $array2
 * @return array
 */

function arrayRecursiveDiff($array1, $array2){
    $aReturn = array();

    foreach ($array1 as $mKey => $mValue) {
        if (array_key_exists($mKey, $array2)) {
            if (is_array($mValue)) {
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $array2[$mKey]);
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
            } else {
                if ($mValue != $array2[$mKey]) {
                    $aReturn[$mKey] = $mValue;
                }
            }
        } else {
            $aReturn[$mKey] = $mValue;
        }
    }
    return $aReturn;
}

它工作完美,只有一个小问题:

array(2) {
  ["installed"]=>
  array(3) {
    [3]=>
    string(9) "somevalue1"
    [4]=>
    string(7) "somevalue2"
    [5]=>
    string(5) "somevalue3"        
  }
  ["backend"]=>
  array(1) {
    ["preload"]=>
    array(2) {
      [0]=>
      string(7) "somevalue4"
      [1]=>
      string(10) "somevalue5"
    }
  }
}

如您所见,必须重新索引“已安装”的子数组。事实上,我需要递归地重新索引这个数组(或者更好的是,我需要 arrayRecursiveDiff 函数来返回一个正确索引的数组)。我尝试了不同的方法,但现在似乎我的大脑被炸了!

【问题讨论】:

  • 你能发布你发送到函数的数据吗?
  • 当然,这里是示例代码:codepad.org/1uFqzhJ0

标签: php array-difference


【解决方案1】:

也许这个功能会解决你的问题

var_dump(array_map("array_values",arrayRecursiveDiff($a,$b)));

编辑: 这个保留非数字索引:

var_dump(array_map(create_function('$x','$k = key($x); return (is_numeric($k)) ? array_values($x) : $x;'),$aDiff));

请注意,此功能仅适用于 2 级数组重新索引。

【讨论】:

  • 谢谢,效果很好,codepad.org/XHLtR9WU 我正在尝试找出递归方式以支持超过 1 个级别,将在此处回复
  • Okie,所以使用你的例子这似乎对我来说适用于多暗阵列。我使用了超过 1 个 func,但我认为这没关系,因为其他函数也很有用,也可以在我的代码中的其他地方使用:codepad.org/76TEonav
  • 太好了,别忘了将此(或您的)答案设置为已接受
  • 我接受了您的回答,非常感谢您的帮助。问候
【解决方案2】:

试试这个。排序功能会帮助你

 $array = array (
  "installed"=>
  array (     
    3 =>     "somevalue1",
    4 =>     "somevalue2",
    5 =>     "somevalue3"
  ),
  "backend"=>
  array (
    "preload"=>
    array(
      0=>
      "somevalue4",
      1=>
      "somevalue5"
    )
  )
);
var_dump($array);
sort($array['installed']);
var_dump($array);

遍历变量并使用排序,这将帮助您递归。

foreach($array as $tmparray){
   $newArray = sort($tmparray);
var_dump($newArray);
}

【讨论】:

  • 所以如果我需要对多维数组执行此操作,我需要递归执行,对吗?谢谢,如果我无法修复数组差异函数以返回我的预期结果,这似乎是可行的方法。如果没有其他方法,我将不得不承担更多的性能开销。
【解决方案3】:

您可以像这样重新索引数组:$arr = array_values($arr);

我会发布代码以递归地重新索引,但这并不难,您应该自己尝试然后将代码发布在这里。

【讨论】:

  • 听起来像是一个选项,我应该如何检查当前子数组是否是关联的? (如果是关联的,我不想使用 array_values 否则我会破坏它)。或者也许我应该只使用排序?如果它是关联数组,我可能不想排序(通过关联,我的意思是至少 1 个键是字符串,而不是整数)
猜你喜欢
  • 2021-02-05
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
相关资源
最近更新 更多