毎日の開発では、 array_diff()は非常に実用的なPHPビルトイン機能です。 2つ以上の配列を比較するために使用でき、最初の配列で値を返しますが、後続の配列では返されません。これは、データのフィルタリング、リストの違いなどの比較などのシナリオで非常に一般的です。
質問は次のとおりです。Array_diff ()は、値を比較するときに厳密なタイプマッチングを実行しますか?言い換えれば、異なるタイプのアイテムですが、同じ値が同じと見なされますか、それとも異なりますか?
PHPでは、 array_diff()は「非厳格な」比較を使用します。つまり、2つの値が等しいかどうかを判断するときにデータ型を比較しませんが、値が「等しい」かどうかにのみ焦点を当てます。
この比較方法は、PHPの「ゆるい比較」と呼ばれ、 ===ではなく、 ==演算子を使用して行われた判断と同様に動作します。
<?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];
$result = array_diff($array1, $array2);
print_r($result);
?>
Array
(
[2] => 3
[3] => 4
)
この例では:
1 (整数)および「1」 (文字列)は等しいと見なされるため、ろ過されます。
3と「3」は$ array2ではないため、予約されています。
「4」と4は等しいと見なされ、ろ過されます。
結論:PHPのarray_diff()は、厳密なタイプの比較を実行しません。
array_diff()自体は厳密な比較をサポートしていませんが、PHPは別の関数array_diff_assoc()を提供します。これは、値の比較に加えてキー名を比較します。
ただし、値の厳密な比較のみを気にする場合は、 array_udiff()を使用して、カスタム比較関数との厳密な比較を実現できます。
<?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];
$result = array_udiff($array1, $array2, function ($a, $b) {
if ($a === $b) return 0;
return ($a > $b) ? 1 : -1;
});
print_r($result);
?>
Array
(
[0] => 1
[2] => 3
[3] => 4
)
この例では、 1 (int)と「1」 (文字列)は異なる値として扱われるため、 1は保存されます。これにより、厳密なタイプの比較の目的が達成されます。
ユーザー(すべての文字列)によってアップロードされた製品IDのリストがあり、データベースに既に存在するID(統合)を削除する必要があるとします。厳格なマッチングで誤ったマッチングを避けることができます。
<?php
$uploadedIDs = ["101", "102", "103"];
$existingIDs = [101, 104];
$diff = array_udiff($uploadedIDs, $existingIDs, function ($a, $b) {
return $a === $b ? 0 : ($a > $b ? 1 : -1);
});
// 1つを作成する必要があるとします URL 残りを見せます ID
$url = "https://m66.net/products?ids=" . implode(",", $diff);
echo $url;
?>
出力URL:
https://m66.net/products?ids=101,102,103
array_diff()は、型の違いに関係なく、ゆるい比較を使用します。
値タイプを厳密に一致させる必要がある場合は、 array_udiff()をカスタム比較関数で使用できます。
ユーザーデータとタイプに敏感なデータフィルタリングを扱う場合、論理的な脆弱性を回避するために厳格な比較を使用することをお勧めします。
この記事が、PHPの配列差関数の動作メカニズムを理解するのに役立つことを願っています!