array_search関数とは?
PHPのarray_search関数について学んだことを備忘録としてまとめます。(勉強中につき、間違って理解している部分もあるかもしれませんのでご容赦ください)
array_searchは、配列内から特定の値を検索し、見つかった場合はその値のキー(インデックス番号)を返す関数です。
- 添字配列に使用した場合、検索した値のインデックス番号を返します。
- 該当する値が複数ある場合は、はじめに見つかったインデックス番号を返します。
- 連想配列を検索した場合、見つかった値のキーを返します。
下の例では、配列の中から「orange」という値を検索しています。
添字配列なのでインデックス番号が返ってきます(配列は先頭が0なので、この場合は1を返す)。
配列内に「orange」は2つありますが、array_searchが返すのははじめの一つだけです。
PHP
$arr = ['apple','orange','lemon','orange','tomato','poteto','cherry']; $index = array_search('orange',$arr); var_dump($index);//結果は「1」
第三引数を指定して型も一致させる
array_searchは第三引数にtrueを設定することで、型が一致しているかどうかまでチェックできます。
第三引数は省略が可能ですが、その場合は型を無視して検索されるので使用する状況によっては注意が必要です。
下の例では数値の「35」を検索しているので完全に一致しているキーは「神奈川一郎」のはずですが、第三引数を省略しているので文字列の「35」も一致しているとみなされ、そのキーである「埼玉次郎」を返しています。
PHP
$arr = ['東京太郎' => '24', '埼玉次郎' => '35', '千葉花子' => 21, '神奈川一郎' => 35]; $key = array_search(35,$arr); var_dump($key);//結果は「埼玉次郎」
今度は第三引数にtrueを加えて、型も一致するようにします。
数値の「35」を持つキー「神奈川一郎」が返ってきます。
PHP
$arr = ['東京太郎' => '24', '埼玉次郎' => '35', '千葉花子' => 21, '神奈川一郎' => 35]; $key = array_search(35,$arr,true); var_dump($key);//結果は「神奈川一郎」
array_searchで条件分岐を作るときの注意点【0もfalseとして扱われる】
array_searchを使って一致する値が見つかった場合の処理を作るとき、条件分岐には「false」を使って次のように書きたくなります。
PHP
$arr = ['apple','orange','lemon','orange','tomato','poteto','cherry']; $index = array_search("apple",$arr); if($index != false){ //一致する値が見つかった場合の処理 }else{ //一致する値が見つからなかった場合の処理 }
この時注意しなければいけないのが、比較演算子で型まで判定させないと「0」もfalseとして扱われるということです。
上記の例では、検索している値「apple」は先頭に存在するため、返り値(インデックス番号)は「0」です。
型まで判定しないと「0」もfalseとして扱われてしまうため、「見つからなかった」という処理に進んでしまいます。
このような条件分岐を作る場合は、比較演算子を「!==」と書き、型まで判定させた方が確実なようです。。
多次元連想配列内をarray_searchで検索する
多次元連想配列に対してarray_searchで検索を掛けたい場合は、array_column関数と組み合わせて行います。
検索した値を持つレコード(行)を取得したい時に利用できます。
array_columnは多次元連想配列から特定のカラムの値のみを抽出して新しい配列を生成する関数です。
下の例では、多次元連想配列から「age」が「21」であるレコードの「name」を取得しています。
PHP
$arr = [ ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'], ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'], ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'], ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'], ['id' => 5, 'name' => '茨城春子', 'age' =>'48', 'furigana' => 'イバラキハルコ'], ['id' => 6, 'name' => '栃木三郎', 'age' =>'48', 'furigana' => 'トチギサブロウ'], ]; $target_column = array_column($arr,'age'); $index = array_search('21',$target_column); echo "arrで「age」が「21」のレコードは「" . $arr[$index]['name'] . "」です。"; //結果:arrで「age」が「21」のレコードは「千葉花子」です。
9行目多次元連想配列に対してarray_columnを使って「age」の値のみを抽出しています。
10行目array_columnで生成した配列に対してarray_searchを行い、マッチする値のインデックス番号を取得します。
11行目取得したインデックス番号を使って、元の多次元連想配列からレコードもしくは必要な値を表示させています。
array_column関数について詳しくはこちらのページをご覧ください。
in_array関数やarray_keys関数との違い
PHPには同じように配列内の検索に使用するin_arrayやarray_keysという関数もあります。
それぞれ戻り値に違いがあるのでシチュエーションに合わせた使い分けが必要です。
in_array関数
- 配列内に特定の値が存在するかどうかを判定
- 戻り値は、存在した場合は「true」存在しなかった場合は「false」となる
- 検索した値のキーや位置を取得することはできない
in_arrayについて詳しくはこちらのページをご確認ください。
array_keys関数
- 配列からすべてのキー、もしくは特定の値を持つキーを取得
- 取得したキーを配列に入れて返す
- 対象の配列内で該当するすべての値のキーが取得できる
array-keysについて詳しくはこちらのページをご確認ください。
まとめ
以上が、PHPのarray_search関数を使って配列内を検索してインデックス番号を取得する方法です。
データベースのデータなどPHPを扱う上で配列の検索は必須だと思いますので、array_searchを含め配列を操作する関数はぜひともマスターしておきたいところです。