ループ文の中で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の標準関数も使っていこうじゃないかと思って使ってみました。
多分普通にループ文を使うことになるんですが、調べながらどうなのか検証するって作業は割と楽しかったです。