2

$old と $new という 2 つの多次元配列があります。2 つの配列を比較して、2 つの間でどの k=>v が追加、削除、または変更されたかを確認したいと考えています。

これらは配列です:

$old = array(
    'ONE'   => array('a' => 1, 'b' => 2, 'c' => 3),
    'TWO'   => array('a' => 4, 'b' => 5, 'c' => 6),
    'THREE' => array('a' => 7, 'b' => 8, 'c' => 9)
);

$new = array(
    'TWO'   => array('a' => 5, 'b' => 5, 'c' => 6),
    'THREE' => array('a' => 7, 'b' => 8, 'c' => 9),
    'FOUR'  => array('a' => 1, 'b' => 2, 'c' => 3)
);

$new 配列で、'ONE' を削除し、'FOUR' を追加し、'TWO'=>'a' の値を 4 から 5 に変更したことに注意してください。

これは私の現在の(動作中の)ソリューションですが、これほど多くのコードを記述する必要はないと感じており、はるかに大きな配列で遅くなるかどうかはわかりません。

$added = array();
$removed = array();
$changed = array();

foreach ($old as $old_key => $old_value) {
    if (!in_array($old_key, array_keys($new))) {
        $removed[] = $old_value;
        unset($old[$old_key]);
    }
}

foreach ($new as $new_key => $new_value) {
    if (!in_array($new_key, array_keys($old))) {
        $added[] = $new_value;
        unset($new[$new_key]);
    }
}

$changed = array_udiff($new, $old, create_function(
    '$a,$b',
    'return strcmp(implode("", $a), implode("", $b));'
));
4

1 に答える 1