array_diff()は、phpの非常に実用的な配列関数です。その機能は、最初のアレイに存在するが、他の配列には存在しない配列に値を返すことです。その構文は単純に見えますが、実際に使用されているときに「結果が間違っているのはなぜですか?」この記事では、一般的なエラーの使用法とデバッグ手法を要約して、 array_diff()をより効率的に使用するのに役立ちます。
$array1 = ["apple", "banana", "cherry"];
$array2 = ["banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);
出力:
Array
(
[0] => apple
)
ご覧のとおり、 array_diff()は、キー名に関係なく値を比較し、 $ array1であるが$ array2ではない部分を返します。
$array1 = [1, 2, 3];
$array2 = ["2", "3"];
$result = array_diff($array1, $array2);
print_r($result);
予想出力:
Array
(
[0] => 1
)
実際の出力:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
これは、 array_diff()が非ストリック比較を使用しているためです( ===ではなく==に相当)。場合によっては、文字列や数字が互いを正常に変換せず、比較の障害をもたらします。
解決策:カスタム比較関数を使用してarray_udiff()を使用して、「厳密な比較」を実現できます。
function strict_compare($a, $b) {
return ($a === $b) ? 0 : 1;
}
$result = array_udiff($array1, $array2, 'strict_compare');
print_r($result);
$array1 = ["apple", "banana", "apple"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);
出力:
Array
(
[0] => apple
[2] => apple
)
注: array_diff()は重複排除ではなく、元の配列にすべての未確認の値と元のキー名を保持します。
$array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);
出力:
Array
(
[a] => apple
)
配列が連想配列である場合でも、 array_diff()は値のみを比較し、キーを比較しません。キー名は結果に保存されています。
中間変数を印刷します
var_dump($array1, $array2);
渡す2つの配列には、予期しない文字列/数のミキシング、スペース、またはフォーマットの問題がないことを確認してください。
json_encode()を使用してデータ構造を確認します
echo json_encode($array1);
値のタイプを迅速に確認するのに役立ちます。または、暗黙の文字(スペース、ラインブレークなど)があるかどうかを確認します。
関数をデバッグしてみてください array_udiff()を使用する場合は、ログまたはデバッグステートメントを追加して、比較関数の値の比較を表示することを忘れないでください。
$urls = [
"https://m66.net/page1",
"https://m66.net/page2",
"https://m66.net/page3"
];
$visited = [
"https://m66.net/page2",
"https://m66.net/page3"
];
$unvisited = array_diff($urls, $visited);
print_r($unvisited);
URLの1つにトレーリングスペースまたは/ような小さな違いがある場合、それはまた、正しく比較できないことにつながります!
データをクリーニングして比較することをお勧めします。
$urls = array_map('trim', $urls);
$visited = array_map('trim', $visited);
$unvisited = array_diff($urls, $visited);
array_diff()は強力なツールですが、非厳格な比較と比較のみの値のみを使用するため、一貫性のないデータ型または形式の場合、簡単にエラーを作成できます。その根本的な行動を理解し、適切なデバッグスキルを組み合わせることによってのみ、本当にうまく使用できます。
この記事が、array_diff()を使用するときに遭遇する「結果が間違っている」という問題をトラブルシューティングして解決するのに役立つことを願っています。より複雑なシナリオや比較ニーズに遭遇した場合は、 Array_udiff()またはカスタムロジックを組み合わせて、より詳細な制御を実現することも検討することもできます。