この関数を使用して、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;
}
それは完璧に機能しますが、小さな問題が1つだけあります。
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 関数が必要です)。私はさまざまな方法を試しましたが、今のところ私の脳は揚げられているようです!