array_keys
LaravelでのWebアプリ制作の実務において、PHPで多次元連想配列から値の抽出を行う状況があり、その際array_keys関数について学んだので、覚えた内容を備忘録として残しておきます。
(※array_keys関数について完全に理解できている訳ではないので、説明が至らない部分があることをご容赦ください。)
PHPのarray_keys関数は対象の配列からすべてのキー、もしくは特定の値を持つキーを取得して新しい配列として返してくれる関数です。
基本的には下記のように引数に配列と検索する値をセットして使用します。
添字配列に使用する
第二引数以降は省略可能ですが、添字配列に使用してもインデックス番号が丸々返って来るだけなので、ここでは第二引数を指定したパターンを確認してみます。
array_keysでは第二引数に指定した値を持つキーのみを抽出することができます。このとき第三引数にtrueを指定すると型が一致しているかまで判定します。
下の例では配列の中から「orange」の位置を検索しています。
PHP
$arr = ['apple','orange','lemon','orange','tomato','poteto','cherry']; $keys = array_keys($arr,'orange'); var_dump($keys); /*結果 array(2) { [0]=> int(1) [1]=> int(3) } */
3行目「orange」は配列内に2つ存在するので、2つのインデックス番号が新しい配列に入って返ってきます。
連想配列に使用する
連想配列の場合はキーのみを全て取得したいという状況もあるので、第二引数を省略したパターンも確認してみます。
下の例のようにキーのみを格納した新しい配列を作成できます。
PHP
$arr = ['東京太郎' => 'man', '埼玉次郎' => 'man', '千葉花子' => 'woman', '神奈川一郎' => 'man', '茨城春子' => 'woman']; $keys = array_keys($arr); var_dump($keys); /*結果 array(5) { [0]=> string(12) "東京太郎" [1]=> string(12) "埼玉次郎" [2]=> string(12) "千葉花子" [3]=> string(15) "神奈川一郎" [4]=> string(12) "茨城春子" } */
続いては、先ほど同様に第二引数を設定して値を持つキーを抽出してみます。
値が「man」であるキーだけが新しい配列に格納されます。
PHP
$arr = ['東京太郎' => 'man', '埼玉次郎' => 'man', '千葉花子' => 'woman', '神奈川一郎' => 'man', '茨城春子' => 'woman']; $keys = array_keys($arr,'man'); var_dump($keys); /*結果 array(3) { [0]=> string(12) "東京太郎" [1]=> string(12) "埼玉次郎" [2]=> string(15) "神奈川一郎" } */
多次元連想配列に使用する
データベースのテーブルから渡されたデータは多次元連想配列になっていることが多いと思います。
そこで今度はarray_keysを使って、多次元連想配列から特定のカラムに指定した値を持つレコードを全て取り出してみます。
このケースでは、はじめにarray_column関数を利用して特定のカラムの値のみを抽出した配列を用意し、その配列に対してarray_keysで該当するインデックスを取得、このインデックス番号で元の配列から任意のレコードを取り出すという流れになります。
下の例では「age」が「48」のレコードを取り出してみます。
PHP
$arr = [ ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'], ['id' => 2, 'name' => '埼玉次郎', 'age' =>'48', 'furigana' => 'サイタマジロウ'], ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'], ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'], ['id' => 5, 'name' => '茨城春子', 'age' =>'32', 'furigana' => 'イバラキハルコ'], ['id' => 6, 'name' => '栃木三郎', 'age' =>'48', 'furigana' => 'トチギサブロウ'], ]; $col = array_column($arr,'age'); $keys = array_keys($col,'48'); for($n = 0; $n < count($keys); $n++){ $index = $keys[$n]; echo $arr[$index]['name'] . "<br>"; } //結果: 埼玉次郎 神奈川一郎 栃木三郎
10行目array_column関数を使って元の多次元連想配列の「age」キー値のみを取り出し、新しい配列を生成しています。
11行目「age」の値を収めた配列に対しarray_keysを使います。調べたい値「48」を持つインデックスが返ってきます。
13行目array_keysの戻り値の数だけループで処理を行い、元の配列からマッチしたレコードを取り出しています。
15行目「age」が「48」である「埼玉次郎」「神奈川一郎」「栃木三郎」のみ表示されます。
PHPのarray_columnについて詳しくはこちらのページをご覧ください。
array_searchとの違い
array_search関数は、PHPの配列内から特定の値を検索し、その値のキーを返す関数です。
array_keysもarray_searchも配列内の特定の値の位置を検索できる関数ですが、両者には戻り値に大きな違いがあります。
- array_keysは検索した値を持つキーを配列で返す
- array_searchは検索した値を持つキーのうち、一番最初のものだけを返す
下記の例は、array_searchを使って値が「man」のものを検索した場合のものです。
array_keysの戻り値が「東京太郎」「埼玉次郎」「神奈川一郎」の3つだったのに対し、今回のarray_searchの戻り値は一番はじめにみつかった「東京太郎」の1つだけになっています。
PHP
$arr = ['東京太郎' => 'man', '埼玉次郎' => 'man', '千葉花子' => 'woman', '神奈川一郎' => 'man', '茨城春子' => 'woman']; $search = array_search($arr,'man'); var_dump($search);//結果 string(12) "東京太郎"
結果が重複する可能性がない場合などはarray_searchで良いですが、該当する値が複数存在し、それらを全て取得したい場合はarray_keysが適していると言えます。
PHPのarray_searchについて詳しくはこちらのページをご覧ください。
まとめ
以上が、PHPで配列から特定の値を持つキーを全て取得するarray_keys関数の使い方です。