我使用此功能计算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函数来返回一个正确索引的数组)。我尝试了不同的方法,但看起来我的大脑现在已经炒了!
答案 0 :(得分:2)
也许此功能可以解决您的问题
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级array-reindex。
答案 1 :(得分:0)
试试这个。排序功能会帮助你
$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);
}
答案 2 :(得分:-3)
您可以像这样重新索引数组:$arr = array_values($arr);
我会将代码发布到递归重新索引,但这并不难,你应该自己尝试然后在这里发布代码。