0

この関数を使用して、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 関数が必要です)。私はさまざまな方法を試しましたが、今のところ私の脳は揚げられているようです!

4

3 に答える 3

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 に対してのみ機能することに注意してください。

于 2012-08-23T13:12:38.807 に答える
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);
}
于 2012-08-23T12:51:24.313 に答える
-3

次のように配列のインデックスを再作成できます。$arr = array_values($arr);

再帰的にインデックスを再作成するコードを投稿しますが、それほど難しいことではありません。自分で試してから、ここにコードを投稿してください。

于 2012-08-23T12:46:38.390 に答える