array_diff_ukey()は、PHPで非常に有用な機能です。ユーザー定義の比較関数に基づいて2つの配列のキーを比較し、最初の配列には存在するが2番目の配列には存在しないキー値ペアを含む配列を返すことができます。この関数は非常に直感的ですが、特に配列内の重複キーを扱う場合、場合によっては動作が混乱する可能性があります。
array_diff_ukey()関数の基本的な構文は次のとおりです。
array_diff_ukey(array $array1, array $array2, callable $key_compare_func) : array
$ array1 :最初の入力配列。
$ array2 :2番目の入力配列。
$ key_compare_func :2つのキーを比較するためのユーザー定義のコールバック関数。関数は2つのパラメーターを受け入れ、2つのキー間の関係を示す整数値を返す必要があります。
array_diff_ukey()を使用してキー値のペア間の違いを比較する場合、PHPは2つの配列のキーを通過し、ユーザーが提供する比較関数を通じてキーが等しいかどうかを判断します。重複キーが存在する場合、PHPの動作はまさに私たちが期待するものではないかもしれません。
入力配列に重複キーが含まれている場合、 array_diff_ukey()は、各キーの値を比較のために2番目の配列のキーと比較します。特に、2つの配列に同じキーがあるが、キーが配列内の異なる位置にある場合、PHPはキーの最後の発生に基づいて比較され、前に表示される繰り返しキーを無視します。
配列に複数の重複キーがある場合、 array_diff_ukey()は、キーの最後の発生に基づいて比較を実行します。たとえば、次の2つの配列があるとします。
$array1 = [
1 => 'apple',
2 => 'banana',
2 => 'orange',
3 => 'pear'
];
$array2 = [
2 => 'grape',
4 => 'watermelon'
];
この例では、キー2は$ array1で繰り返されます。 array_diff_ukey()を呼び出して、これら2つの配列を比較してください。
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
return $key1 - $key2;
});
キー2は2回表示されますが、 array_diff_ukey()はそれを2の最後の発生(つまり、オレンジに対応するキー)と比較し、 $ array2のキー2と比較します。その結果、キー2は同じと見なされるため、結果アレイにキーは表示されません。
比較関数のロジックが複雑で特定の比較ルールが含まれている場合、 array_diff_ukey()を各キーの最後の発生に基づいて比較されますが、この比較方法は理想的に考えていない場合があります。現時点では、プログラマーは、不必要な混乱を避けるために、配列の準備段階で重複キーを処分することを検討できます。
Array_diff_ukey()の比較結果に重複したキーが影響しないように配列を処理したいとします。最初にarray_unique()関数を使用して、重複キーを削除してから、差計算を実行できます。
$array1 = [
1 => 'apple',
2 => 'banana',
2 => 'orange',
3 => 'pear'
];
$array2 = [
2 => 'grape',
4 => 'watermelon'
];
// 重複キーを削除します
$array1 = array_unique($array1, SORT_REGULAR);
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
return $key1 - $key2;
});
この例では、最初にarray_unique()を使用して、 $ array1の重複キーを削除して、キー値の比較がより正確であることを確認します。
array_diff_ukey()は、PHPで非常に強力な配列差関数ですが、繰り返されるキーに直面した場合、その動作は混乱する可能性があります。 PHPは、各キーの最後の値を使用して比較します。つまり、重複キーは無視されます。結果への重複キーの影響を回避するために、開発者は、 array_diff_ukey()を使用する前に、アレイの重複によって予想されるように比較操作を確実に実行できます。