PHPでは、 array_diff()は、配列間の違いを見つけることができる非常に一般的な関数です。しかし、実際のプロジェクトで連想配列を扱うためにそれを使用する場合、それがどのように機能するかわからない場合は、多くの「ピット」に分類される可能性があります。
この記事では、 Array_diff() 、一般的な誤解、および連想配列処理におけるいくつかの実用的な手法の動作について詳細に説明します。
$array1 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$array2 = ['a' => 'apple', 'b' => 'blueberry'];
$result = array_diff($array1, $array2);
print_r($result);
出力:
Array
(
[b] => banana
[c] => cherry
)
説明: array_diff()は「値」のみを比較し、キー名を無視します。この例では、 $ array1 ['b'] = 'banana'のキーは$ array2 ['b'] = 'blueberry'と同じですが、 「バナナ」は異なる値による違いの1つと考えられています。
誤解:多くの開発者は、array_diff()がキー値のペアを比較すると考えています。
$a = ['id' => 1, 'name' => 'John'];
$b = ['name' => 'John', 'id' => 2];
var_dump(array_diff($a, $b));
出力:
array(1) {
["id"]=>
int(1)
}
'name' => 'john'は両方の配列で同じですが、 array_diff()はキーを見ないため、値が存在するかどうかにのみ焦点を当てます。したがって、 1が$ bの値ではないため、「ID」=> 1は異なると見なされます。
?解決策:キーと値を同時に比較する場合は、 array_diff_assoc()を使用することをお勧めします。
array_diff_assoc($a, $b);
キーと値を同時に比較し、この「幻想」を避けます。
$a = ['value1' => 123];
$b = ['value2' => '123'];
print_r(array_diff($a, $b));
出力:
Array
(
)
ピットポイント: array_diff()は、正または間違った( == )の厳密な比較を使用するため、 123と「123」は同じと見なされます。
?ヒント:厳密な比較(値とタイプが一貫している必要がある)が必要な場合は、カスタム比較関数を使用してarray_diff()のvariant array_diff_uassoc()を使用できます。
$result = array_udiff($a, $b, function($a, $b) {
return $a === $b ? 0 : ($a > $b ? 1 : -1);
});
array_diff()は1次元アレイツールであり、多次元配列の場合、再帰的に比較されません。
$a = ['info' => ['id' => 1, 'name' => 'Tom']];
$b = ['info' => ['id' => 1, 'name' => 'Tom']];
print_r(array_diff($a, $b));
出力:
Array
(
[info] => Array
(
[id] => 1
[name] => Tom
)
)
原因:配列タイプの値は、array_diff()の文字列として扱われ、2つの配列の内容が等しいかどうかを直接比較することはできません。
?解決策:多次元配列を比較する場合は、再帰関数を手動で記述するか、シリアル化変換と比較する必要があります。
$a_serialized = array_map('serialize', $a);
$b_serialized = array_map('serialize', $b);
$diff = array_diff($a_serialized, $b_serialized);
データベースからデータをオリジナル$に引き出すと、ユーザーがフォームを$ new_dataに送信し、どのフィールドが変更されたかを知りたいとします。
$original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];
$changed = array_diff_assoc($new_data, $original);
これにより、ユーザーによってどのフィールドが変更されたかを正確に取得できます。
2つの構成配列$ config1と$ config2 :
$config1 = include 'http://m66.net/config/old.php';
$config2 = include 'http://m66.net/config/new.php';
$diff = array_diff_assoc($config2, $config1);
これにより、特に自動化されたスクリプトでの書き込みに適した構成変更に簡単にアクセスできます。
方法 | コンテンツを比較します | タイプを区別するかどうか | シーンに適しています |
---|---|---|---|
array_diff() | 値のみを比較します | いいえ | 単純な値の比較 |
array_diff_assoc() | 値とキー名を比較します | いいえ | フォーム、構成比較 |
array_udiff() | カスタム比較方法 | カスタマイズ可能 | 厳密なタイプの比較 |
serialize + array_diff() | 多次元配列比較 | いいえ(スケーラブル) | 多次元構造比較 |
array_diff()を使用する場合、比較しているものについて明確にしてください。キー名に惑わされないでください。また、タイプの影響を忘れないでください。これらの原則を理解することによってのみ、このツール機能を本当に使用できます。
プロジェクトで特別な比較のニーズに遭遇した場合は、ガジェット関数カプセル化ロジックを手作業で作成してください。これにより、コードの読みやすさが向上するだけでなく、ピットに侵入する可能性も低下します。