PHPでは、 array_udiff()は非常に強力な関数であり、カスタム比較関数を使用して2つ以上の配列間の違いを比較できます。これは、単純な値や重要な比較に依存するのではなく、特定のビジネスニーズに基づいて「等しい」または「不平等な」判断ロジックを柔軟に定義できることを意味します。
array_udiff(array $array1, array $array2, callable $value_compare_func): array
$ array1 :比較される最初の配列。
$ array2 :最初の配列と比較する必要がある2番目の配列。
$ value_compare_func :ユーザー定義の比較関数。
この関数は、値を$ array1で返しますが、 $ array2ではなく、ユーザー定義の関数と比較されます。
2つのユーザーリストがあるとします。つまり、今日ログインしたユーザーと過去1か月間アクティブになったユーザーです。各ユーザー情報は、 IDと電子メールを含む配列です。今日ログインしているユーザーの1つ、つまり過去にアクティブになったユーザーの1つである「新しいユーザー」がどの「新しいユーザー」があるかを知りたいと思います。
// ユーザーは今日ログインしました
$todayUsers = [
['id' => 101, 'email' => 'alice@m66.net'],
['id' => 102, 'email' => 'bob@m66.net'],
['id' => 103, 'email' => 'carol@m66.net'],
];
// 先月のアクティブユーザー
$pastActiveUsers = [
['id' => 102, 'email' => 'bob@m66.net'],
['id' => 104, 'email' => 'dan@m66.net'],
];
// カスタム比較関数:合格 email ユーザーが同じかどうかを判断します
function compareUsersByEmail($a, $b) {
return strcmp($a['email'], $b['email']);
}
// 探し出す“新しいユーザー”
$newUsers = array_udiff($todayUsers, $pastActiveUsers, 'compareUsersByEmail');
// 出力結果
echo "新しいユーザー列表:\n";
foreach ($newUsers as $user) {
echo "- {$user['email']} (ID: {$user['id']})\n";
}
新しいユーザー列表:
- alice@m66.net (ID: 101)
- carol@m66.net (ID: 103)
array_udiff()の比較関数は、整数を返す必要があります。
負の数:最初のパラメーターが2番目のパラメーターよりも小さいことを意味します。
0:2つの値が等しいことを意味します。
正の数:最初のパラメーターが2番目のパラメーターよりも大きいことを意味します。
カスタム比較関数では、配列要素の構造を明確に理解し、未定義のキーへのアクセスを避けてください。
電子メールだけでなくIDにも比較したい場合は、次のような比較関数を書くことができます。
function compareUsersByIdAndEmail($a, $b) {
$emailCompare = strcmp($a['email'], $b['email']);
if ($emailCompare !== 0) {
return $emailCompare;
}
return $a['id'] <=> $b['id'];
}
array_udiff()でこの関数を使用すると、より洗練された違いの比較を達成できます。
array_udiff()は、特に構造化されたデータのシナリオを処理するのに適した、非常に柔軟なarray違いセット比較方法を提供します。カスタム比較機能を通じて、任意の複雑なロジックについて判断を下し、配列処理の自由と表現力を大幅に改善できます。
ユーザー情報、製品リスト、ロギングなどなどの複雑なビジネスデータを処理する場合、 array_udiff()の使用を習得することは間違いなく重要なスキルです。