やりたいこと
たとえば
$array = ['apple1','apple2','orange1','orange2',];
という配列から
$apple = ['apple1','apple2'];
という配列を抜き取りたい。(例が単純すぎてすいません)
preg_grep()について
そんなときに使える関数に preg_grep があります。
文法
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
- $pattern = 正規表現のパターン
- $input = 検索対象となる配列
- $flags =
PREG_GREP_INVERT
と入れると正規表現にマッチ__しない__要素が返されます
返り値
正規表現とマッチする値を持つ要素で構成された配列を返します。
正規表現にマッチする配列の「値」を抜き出す場合
$array = ['apple1','apple2','orange1','orange2',];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
//結果
array(2) {
[0]=>
string(6) "apple1"
[1]=>
string(6) "apple2"
}
!apple[0-9]!
の両脇の !
は「デリミタ」です。
!
以外にも英数字、バックスラッシュ、空白文字以外の任意の文字
なら何でもいいみたいですが、入れないとエラーが出ます。
連想配列で使うとこんな感じです。
$array = [
'A' => 'apple1',
'B' => 'apple2',
'C' => 'orange1',
'D' => 'orange2',
];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
//結果
array(2) {
["A"]=>
string(6) "apple1"
["B"]=>
string(6) "apple2"
}
正規表現にマッチする配列の「鍵」を抜き出す場合
preg_grep()
はあくまで「値」を検索する関数で、「鍵」を検索するオプションはありません。無理やり使うとこうなります。
$array = [
'apple1' => 'A',
'apple2' => 'B',
'orange1' => 'C',
'orange2' => 'D',
];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
//結果
array(0) {
}
いろいろとやり方があると思いますが、今回は array_flip() を使って鍵と値の位置を逆転させる → preg_grep()
する → もう一回 array_flip()
でもとに戻すという方法を紹介します。
$array = [
'apple1' => 'A',
'apple2' => 'B',
'orange1' => 'C',
'orange2' => 'D',
];
$flipped_array = array_flip($array);
$flipped_apple = preg_grep('!apple[0-9]!',$flipped_array);
$apple = array_flip($flipped_apple);
var_dump($apple);
//結果
array(2) {
["apple1"]=>
string(1) "A"
["apple2"]=>
string(1) "B"
}
一行バージョン
$array = [
'apple1' => 'A',
'apple2' => 'B',
'orange1' => 'C',
'orange2' => 'D',
];
$apple = array_flip(preg_grep('!apple[0-9]!',array_flip($array)));
var_dump($apple);
//結果
array(2) {
["apple1"]=>
string(1) "A"
["apple2"]=>
string(1) "B"
}