毎日のPHPプログラミングでは、 array_diff()は非常に実用的な機能であり、2つの配列の違いを見つけるために使用できます。しかし、多くの開発者は、この関数を使用するときに奇妙な状況に遭遇する可能性があります。
どうしたの?一緒に理由を探りましょう。
次のコードを見てみましょう。
$a = [true, false];
$b = [0];
$result = array_diff($a, $b);
print_r($result);
TrueとFalseは配列$ Bにないと直観的に考えるかもしれません。したがって、 $の結果は[True、False]である必要がありますが、実際には次の出力を取得します。
Array
(
[0] => 1
)
あなたは少し混乱していますか?偽りが除外されるのはなぜですか?そして、 TRUEも整数1になりますか?この問題を徐々に分解しましょう。
まず、 array_diff()の根本的な動作を理解する必要があります。 公式のPHPドキュメントの指示によると:
array_diff()は、「非ストリクトの比較」(==)を使用して、値が等しいかどうかを確認します。
つまり、 array_diff()は合同==を使用して値を比較するのではなく、double equir sign ==を使用します。
これは、次の値が「等しい」と見なされることを意味します。
false == 0; // true
true == 1; // true
true == "1"; // true
false == ""; // true
この例では、 falseは0で等しく判断されるため、 array_diff()によって結果から除外されます。
別の詳細は、 array_diff()によって返される配列が数値値の配列であり、PHPは場合によってはブール値を暗黙的に変換することです。例えば:
var_dump(true); // 出力 bool(true)
echo true; // 出力 1
print_r()に出力が出力されると、boolean trueは1に変換されます。そのため、結果に1が表示されますが、真実ではありません。
データ型を比較する必要がある場合(たとえば、 Trueと1を区別する必要があります)、 array_udiff()を使用して、カスタム比較関数と協力できます。
$a = [true, false];
$b = [0];
$result = array_udiff($a, $b, function($x, $y) {
return ($x === $y) ? 0 : 1;
});
print_r($result);
出力:
Array
(
[0] => 1
[1] =>
)
一致する比較===を使用したため、今回はfalse (対応する値が空です)も保存されていることに注意してください。
これらの値をより明確に区別し、ブールタイプの表現を保存する必要がある場合は、 var_export()を組み合わせて結果を出力できます。
var_export($result);
Array_diff()のデフォルトの動作は、多くのシナリオで非常に効率的ですが、ブール値、数字、文字列の配列を扱う場合、混乱する結果を簡単に作成できます。これは、PHPの弱体化によって引き起こされる典型的なトラップでもあります。
開発では、データ型に厳密な要件がある場合は、デフォルトのarray_diff()を使用しないようにし、代わりにarray_udiff()を使用し、独自の比較機能を提供すると、より安全で信頼性の高いアプローチです。