LoginSignup
1
0

More than 5 years have passed since last update.

正規表現を使って配列をフィルターしてみる

Last updated at Posted at 2018-10-07

ループ文の中でifを使う

適当な文字列の配列を用意して、その中から先頭に「-」がついているワードをフィルターしてみる。

$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = [];
foreach ($keywords as $i => $keyword) {
    if (!preg_match('/^-.*/', $keyword)) {
        $filtered[] = $keyword;
    }
}
var_dump($keywordFiltered);

結果(var_dump)

array (size=3)
  0 => string '野菜' (length=6)
  1 => string 'じゃがいも' (length=15)
  2 => string 'すいか' (length=9)

array_filterを使う

PHPにはarray_filterという関数があるので使ってみる。

第一引数には配列、第二引数にはコールバック関数を渡す。

コールバック関数は、外出しして関数名を指定してもいいが、無名関数でもいける。

下の場合は無名関数を使用。

$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = array_filter($keywords, (function($keyword) {
    return !preg_match('/^-.*/', $keyword);
}));
var_dump($keywordFiltered);

結果(var_dump)

array (size=3)
  0 => string '野菜' (length=6)
  3 => string 'じゃがいも' (length=15)
  4 => string 'すいか' (length=9)

関数を外出しするとこんな感じ。

function filterMinusWord(string $keyword):bool
{
    return !preg_match('/^-.*/', $keyword);
}
$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = array_filter($keywords, 'filterMinusWord');
var_dump($keywordFiltered);

ただこのままだと添字が飛び飛びになってしまっているので、array_valuesを使うと、添字の振り直しができる。

filterした差分の配列を取得する

場合にもよるけど、全体とフィルター後の配列の差分を取りたい場合もあるので、その場合の方法も書いてみる。

そういう場合には、array_diffを使う。

array_diffも返ってくる配列の添字が飛び飛びなので、array_valuesで添字の振り直しが必要。

$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
function filterMinusWord(string $keyword):bool
{
    return !preg_match('/^-.*/', $keyword);
}
$keywordPlus = array_filter($keywords, 'filterMinusWord');
$keywordMinus = array_diff($keywords, $keywordPlus);
var_dump(array_values($keywordMinus));

結果(var_dump)

array (size=2)
  0 => string '-にんじん' (length=13)
  1 => string '-きゃべつ' (length=13)

処理速度

配列の要素数を10000にして比較してみた。
array_valuesとか使ってるので、単純な比較ではなくなってるけどやっぱり単なるループの方が早い。

# ループ文
0.0078341960906982(sec)
# array_filter
0.011768102645874(sec)

使ってみた感想

なんかこういうときに思考停止してループばっかり書いてるので、たまにはPHPの標準関数も使っていこうじゃないかと思って使ってみました。

多分普通にループ文を使うことになるんですが、調べながらどうなのか検証するって作業は割と楽しかったです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0