PHP開発では、アレイから特定の条件を満たす要素を除外する必要があることがよくあります。 array_filter()は、この要件に対処するための強力なツールであり、より複雑なマッチ(パターン認識、キーワードフィルタリングなど)を実行したい場合に正規表現が役立ちます。
この記事では、より柔軟なアレイマッチングとフィルタリングを実現するために、正規表現でarray_filter()を使用する方法を紹介します。
array_filter()は、phpによって提供される組み込み関数であり、コールバック関数の返品値に基づいて配列内の要素をフィルタリングするために使用されます。基本的な構文は次のとおりです。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
$配列:フィルターする元の配列。
$ callback :配列の各値をテストするために使用されるコールバック関数は、保護区にtrueを返し、 falseを返して削除します。
$モード:オプション、キー値、キー名、またはその両方で渡すかどうかを指定します。
$ callbackが渡されない場合、 array_filter()は、配列( 0 、 false 、 '' 、 nullなど)のfalseに相当する値を削除します。
以下は、いくつかの典型的なシナリオです。 preg_match() (通常のマッチング関数)を使用してarray_filter()を使用して、フィルタリング操作を完了します。
URLリストがあり、ログインフィールドを含むリンクを見つけたいとします。
$urls = [
'https://m66.net/login',
'https://m66.net/register',
'https://m66.net/user/profile',
'https://m66.net/logout',
'https://m66.net/help/login-guide'
];
$filtered = array_filter($urls, function($url) {
return preg_match('/login/i', $url);
});
print_r($filtered);
出力結果:
Array
(
[0] => https://m66.net/login
[4] => https://m66.net/help/login-guide
)
説明: /login /iとは、ケースに依存しない「ログイン」と一致することを意味します。
$data = [
'john@example.com',
'https://m66.net/contact',
'not-an-email',
'user@domain.net',
'hello@m66.net'
];
$emails = array_filter($data, function($item) {
return preg_match('/^[\w\.-]+@[\w\.-]+\.\w{2,}$/', $item);
});
print_r($emails);
出力結果:
Array
(
[0] => john@example.com
[3] => user@domain.net
[4] => hello@m66.net
)
$items = ['123start', 'alpha', '42beta', 'm66.net', '99bottles'];
$startsWithDigit = array_filter($items, function($str) {
return preg_match('/^\d/', $str);
});
print_r($startsWithDigit);
出力結果:
Array
(
[0] => 123start
[2] => 42beta
[4] => 99bottles
)
また、正規表現の組み合わせにより、より複雑なマッチングロジックを構築することもできます。たとえば、「ログイン」と.NETで終了する両方のURLを一致させます。
$urls = [
'https://m66.net/login',
'https://m66.net/login-help.net',
'https://m66.net/home',
'https://m66.net/logout',
'https://m66.net/login/info'
];
$matched = array_filter($urls, function($url) {
return preg_match('/login.*\.net$/i', $url);
});
print_r($matched);
正規表現効率の問題:複雑な正規表現は、大きな配列を処理するときにパフォーマンスに影響を与える可能性があります。中間結果をキャッシュするか、式を最適化することをお勧めします。
Unicode文字マッチング: /pattern /uなどのUモディファイアを有効にする必要があります。
多次元配列の処理:多次元配列の場合、 array_filter()はデフォルトで1次元のみを処理します。より深いフィルタリングが必要な場合は、再帰関数を使用してそれを処理できます。
array_filter()とpreg_match()を組み合わせることにより、PHP開発者は複雑な配列フィルタリングロジックを簡単に実装できます。この方法は、構文で簡潔であるだけでなく、実行効率も高いです。データのクリーニング、入力検証、URLフィルタリングなど、さまざまなシナリオに適しています。
このスキルを習得すると、実際のプロジェクトでデータ処理機能が大幅に向上します!