毎日の開発では、データフィルタリングは非常に一般的な操作です。特にユーザーの入力を処理する場合、データベースが結果または外部APIデータを返す場合、ブラックリストに登録されたユーザー、資格のない製品、またはデータセットからの処理されたレコードなど、データを「除外」する必要があります。現時点では、2つのPHPネイティブ機能Array_diff()とin_array()が役立ちます。
array_diff()は、アレイの値を比較するために使用され、最初の配列で値を返しますが、他の配列では返されません。例えば:
$allUsers = ['alice', 'bob', 'charlie', 'david'];
$blacklist = ['bob', 'david'];
$filteredUsers = array_diff($allUsers, $blacklist);
print_r($filteredUsers);
// 出力: ['alice', 'charlie']
この例では、ボブとデビッドはブラックリストのメンバーであり、 array_diff()を介して元のデータからそれらを除外します。
in_array()は、アレイに値が存在するかどうかを判断するために使用されます。この機能は、単一の判断を下すのに非常に役立ちます。
たとえば、データを横断するときに特定のアイテムを条件付きで除外する必要がある場合は、次のように書くことができます。
$exclusions = ['spam', 'banned'];
$itemType = 'spam';
if (!in_array($itemType, $exclusions)) {
echo "このアイテムの処理を許可します";
} else {
echo "このアイテムは除外されています";
}
それでは、より実用的な例、 array_diff()とin_array()を組み合わせて、マルチコンディションの除外を達成し、データ処理効率を改善する方法を見てみましょう。
一連の記事データがあり、フィールドに著者、ステータス、タグが含まれているとします。
脅迫された著者を除外します
ドラフトステータスの記事を除外します
タグに「敏感な」キーワードを含む記事を除外します
これを行うことができます:
$articles = [
['title' => '記事1', 'author' => 'tom', 'status' => 'published', 'tags' => ['php', 'web']],
['title' => '記事2', 'author' => 'jack', 'status' => 'draft', 'tags' => ['php', 'センシティブ']],
['title' => '記事3', 'author' => 'lucy', 'status' => 'published', 'tags' => ['laravel']],
['title' => '記事4', 'author' => 'bob', 'status' => 'published', 'tags' => ['センシティブ']],
];
$blacklistedAuthors = ['bob', 'jack'];
$excludedStatus = ['draft'];
$sensitiveTags = ['センシティブ'];
$filtered = array_filter($articles, function ($article) use ($blacklistedAuthors, $excludedStatus, $sensitiveTags) {
// ブラックリストの著者を除外します
if (in_array($article['author'], $blacklistedAuthors)) {
return false;
}
// 特定のステータスを除外します
if (in_array($article['status'], $excludedStatus)) {
return false;
}
// 排除含有センシティブ标签的記事
foreach ($article['tags'] as $tag) {
if (in_array($tag, $sensitiveTags)) {
return false;
}
}
return true;
});
print_r($filtered);
出力は次のとおりです。
Array
(
[0] => Array
(
[title] => 記事1
[author] => tom
[status] => published
[tags] => Array
(
[0] => php
[1] => web
)
)
[2] => Array
(
[title] => 記事3
[author] => lucy
[status] => published
[tags] => Array
(
[0] => laravel
)
)
)
データボリュームが大きい場合は、 Array_diff()を使用して、一度に不要なコンテンツを除外し、loop内のin_array()への頻繁な呼び出しを避けてください。
除外の配列構造をハッシュテーブルに調整する(つまり、キー価値ペア形式)を調整すると、検索速度がさらに向上する可能性があります。
例えば:
$blacklistedAuthors = array_flip(['bob', 'jack']);
if (isset($blacklistedAuthors[$article['author']])) {
return false;
}
ISSET()のパフォーマンスは、通常、 IN_ARRAY()よりも優れています。特に、同時性の高いシナリオでは。
Array_diff()とin_array()を合理的に組み合わせることにより、プログラムの読みやすさと実行効率を改善するために、複数の条件下でデータ除外ロジックをすばやく実装できます。実際の開発では、データ構造と論理的判断を合理的に整理することで、コードがより効率的で安定します。