LoginSignup
7
10

More than 5 years have passed since last update.

PHPで正規表現を使って特定の配列を抜き出す

Last updated at Posted at 2018-12-20

やりたいこと

たとえば

$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"
}

使った関数

7
10
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
7
10