2

私はこのコードを使用します:

 $new = array(
     "123" => "a",
     "456" => "b"
 );

 $old = array(
     "123" => "a",
     "456" => "b"
 );

次に、$new配列は次のようになります。

 $new = array(
     "456" => "b",
     "123" => "c",
     "789" => "e"
 );

ご覧のとおり、$new配列の数が増え、要素の順序が変更され、キーの値123も変更されました。$new配列を配列と比較し、要素の順序や数を気にせず$oldに、キーの値に加えられた変更のみをキャッチする必要があります。123私は試した:

 $result = array_diff( $new, $old );
 print_r( $result );

出力:

 Array ( [123] => c [789] => e )
4

3 に答える 3

5

アップデート。かなり混乱します。今、私たちはそれを手に入れたと思います

$old = array(
    "123"    => "a",
    "456"    => "b"
);
$new = array(
    "456"    => "b",
    "123"    => "c", // catch this (element in old array that is changed)
    "789"    => "e"
);

$new2 = array();
foreach ($new as $key => $new_val)
{
    if (isset($old[$key])) // belongs to old array?
    {
        if ($old[$key] != $new_val) // has changed?
            $new2[$key] = $new[$key]; // catch it
    }
}

// output $new2:
array (
  123 => 'c',
)
于 2012-12-31T12:41:19.407 に答える
2

まず最初に、 のこれらの要素を次のもの$newと比較して変更する必要があり$oldます (「 」を参照array_diff_assoc)。

$changed = array_diff_assoc($new, $old);

その結果のうち、キーが in にある要素のみを取得します$old(「 」を参照array_intersect_key)。

$result  = array_intersect_key($changed, $old);

以上です。役立つ場合は、それを互いにラップできます。

array_intersect_key(array_diff_assoc($new, $old), $old);

結果は次のとおりです。

array(1) {
  [123] =>
  string(1) "c"
}

完全な例 (デモ):

$old = array(
    "123" => "a",
    "456" => "b"
);

$new = array(
    "456" => "b",
    "123" => "c", // catch only the change made on the value at key 123 
    "789" => "e"
);

$changed = array_diff_assoc($new, $old);
$result  = array_intersect_key($changed, $old);

var_dump($result);

最後の注意: PHP には多くの配列関数があります。ほとんどの場合、これらのようなことを行うのに 1 つまたは 2 つしか必要ないため、リストを調べて適切なものを探す価値があります。

于 2012-12-31T15:14:39.953 に答える
0

このコードを要件に使用します

 <?php
    function key_compare_func($key1, $key2)
    {
        if ($key1 == $key2)
            return 0;
        else if ($key1 > $key2)
            return 1;
        else
            return -1;
    }

    $array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
    $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

    var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
    ?>
于 2012-12-31T12:39:36.403 に答える