PHPでは、 array_intersect_uassoc()は強力だが誤解されている機能です。複数の配列のキーと値を比較し、ユーザー定義の関数を介してキーを比較して、交差点部分を返すために使用されます。ただし、キーの比較方法をカスタマイズできるため、潜在的な問題が発生します。キータイプが異なる場合(文字列や整数など)、比較が正確であることを確認する方法は?
array_intersect_uassoc()の基本的な使用法をすばやく確認しましょう。
$result = array_intersect_uassoc(
['1' => 'apple', 2 => 'banana', 3 => 'cherry'],
[1 => 'apple', '2' => 'banana', 3 => 'berry'],
function ($a, $b) {
return strcmp((string)$a, (string)$b);
}
);
print_r($result);
この例では、 strcmp()を使用してキーを比較し、キーを文字列に明示的に変換することに注意してください。これは、異なるタイプによって引き起こされる比較障害を回避するためです。
PHPの配列キーは整数または文字列にすることができ、PHPは特定の状況で自動的にそれらを変換します。たとえば、 '1'は整数1に自動的に変換されます。この自動変換はほとんどの場合問題を引き起こしませんが、 array_intersect_uassoc()を使用する場合、問題が出現する可能性があります。
'1'と1は、通常の配列で同じと見なすことができますが、 strcmp()と比較すると異なります。
PHPの===オペレーターでは、両方のタイプと値が等しいことが必要であるため、多くの開発者はarray_intersect_uassoc()が同じことをすると考えさせます。
しかし、実際には、 array_interect_uassoc()は、渡す比較関数に依存しているため、結果は、型変換の問題を認識しているかどうかに大きく依存します。
異なるタイプによる比較エラーを回避するには、次の戦略を推奨します。
最も安全な方法は、比較関数でキーを同じタイプ(通常は文字列または整数)に手動で変換することです。
function normalize_key_compare($a, $b) {
return strcmp((string)$a, (string)$b);
}
これにより、「1」と1が同じキーとして処理されることが保証されます。
入力データを制御できる場合は、配列を構築するときにキータイプを統合することをお勧めします。たとえば、すべてのキーが番号であると確信している場合は、これを書くことができます。
$array1 = [
1 => 'apple',
2 => 'banana',
3 => 'cherry'
];
$array2 = [
1 => 'apple',
2 => 'banana',
3 => 'berry'
];
これにより、デフォルトのstrcmp()コンパレータが使用されていても、タイプの混乱を引き起こすことはありません。
PHPは自動的に「01」を整数1に変更します。文字列形式のキーを保存する場合は、引用符を使用して、暗黙の変換が発生しないことを確認する必要があります。
$array = [
'01' => 'value'
];
しかし、あなたが書いたら:
$array = [
01 => 'value'
];
キーは整数になります1。
異なるソースから2つのデータセットがあるとします。1つはJSONからデコードされ、もう1つはデータベースからデコードされています。 JSONのキーは文字列である可能性がありますが、データベースのキーは整数です。
$jsonData = json_decode('{"1":"apple","2":"banana"}', true);
$dbData = [
1 => 'apple',
2 => 'banana',
3 => 'cherry'
];
あなたは2つの交差点を見つけたいです、あなたは次のようにそれを処理することができます:
$result = array_intersect_uassoc(
$jsonData,
$dbData,
function ($a, $b) {
return strcmp((string)$a, (string)$b);
}
);
print_r($result);
この時点で、出力は次のとおりです。
Array
(
[1] => apple
[2] => banana
)
array_intersect_uassoc()を使用する場合、重要な比較メカニズムとタイプの一貫性の重要性を理解してください。ここにいくつかの重要な提案があります:
常にキータイプを確認してください。
比較関数を使用する場合の統一タイプ。
結果が期待を満たしていない場合は、最初にキーのタイプの違いを確認します。
可能であれば、データ構造を事前に正規化します。
キータイプの正しい取り扱いは、潜在的なバグを回避するだけでなく、PHPタイプシステムに対する制御を改善することもできます。 PHPアレイ関数に関するより実用的なヒントについては、 https://gitbox.net/php-array-utilsにアクセスしてください。