こんにちは!ライターのmuramatsuです。
PHPでは配列を使用してさまざまな処理が可能ですよね。
今回は配列の処理の中でも、配列のキーを取得する方法を解説していきます。
この記事では、
- array_keys関数とは
- array_keys関数の使い方
という基本的な内容から、
- array_key_existsで配列のキーがあるか確認する方法
- array_keys関数とforeach文を使用したキー取得速度の検証
などの応用的な使い方に関しても解説していきます。
さっそく、array_keys関数についてマスターしていきましょう!
array_keys関数とは
array_keysは、配列のキーと呼ばれる要素番号またはインデックスキーを取得してくれる関数です。
配列の中にある要素を指定してそのインデックスキーを調べたり、要素番号を全て取得して配列の中にいくつ要素があるかを調べる事ができます。
基本構文
第一引数に対象の$配列を指定します。
第二引数に$値を指定した場合は、指定したキーを返します。
指定した$値が無かった場合は、空の配列が返されます。
第三引数のbool(真偽値)にTureを指定した場合は、要素の型の比較 (===)を行うことができます。
デフォルト値はFalseに設定されています。
もし配列に関してまだよく分からない方は以下の配列・連想配列の使い方の記事を参考にしてくださいね。
array_keysの使い方
配列のキーを取得する方法
では実際に、array_keys関数を使用して配列と連想配列のキーを取得する方法を見ていきましょう。
配列
まずは基本的な配列の場合です。
配列$fruitsの要素番号を取得してみます。
サンプルコード
<?php $fruits = [ 'apple', 'orange', 'melon', 'banana', 'pineapple' ]; //array_keysで配列のキーを取得する $fruits_key = array_keys($fruits); print_r($fruits_key); ?>
実行結果
自動的に要素番号が振られ、要素数分のインデックスキーが取得されています。
連想配列
想配列のキーを取得する場合も、基本的に1次元配列と同じ方法で可能です。
サンプルコード
<?php $value_array = ['A'=>100, 'B'=>200, 'C'=>300, 'D'=>400, 'E'=>500]; //array_keysで配列のキーを取得する $value_key = array_keys($value_array); var_dump($value_key);
実行結果
インデックスキーが取得されているのがわかりますね。
指定した値のキーのみを取得する
指定した配列の要素のキーのみを取得したい場合は、array_keys関数の第二引数に配列の要素に含まれる値を指定します。
配列
まずは配列の場合で、array_keys関数の第二引数を指定してみましょう。
サンプルコード
<?php $yen = [ '100円', '150円', '300円', '200円', '500円']; $yen_key = array_keys($yen, '150円'); print_r($yen_key); ?>
実行結果
自動的に要素番号が振られ、0番目から数えて1番目に値150円が位置している事がわかります。
連想配列
次に連想配列の場合で、指定した値が2つあるとどうなるでしょうか。
サンプルコード
<?php $fruits = [ 'apple'=>'100円', 'orange'=>'150円', 'melon'=>'300円', 'banana'=>'200円', 'peach' => '150円', 'pineapple'=>'500円' ]; $fruits_key = array_keys($fruits, '150円'); print_r($fruits_key); ?>
実行結果
サンプルではarray_keys関数の第二引数に配列の値150円を指定しています。
実行結果のとおり、指定した値のキーであるorangeとpeachが取得されて、新しい配列に入っていることがわかります。
型まで指定した値のキーを取得する
型を指定した配列の要素のキーのみを取得したい場合は、array_keys関数の第三引数にTrueを指定します。
まずは型を指定しない場合でみてみましょう。
サンプルコード1
<?php $fruits = [ 'apple'=>'100', 'orange'=>'150', 'melon'=>'300', 'banana'=>'200', 'pineapple'=>'500', 'grape'=> 300, 'peach' => 150 ]; $fruits_key = array_keys($fruits, '300'); print_r($fruits_key); ?>
実行結果
第二引数で値 ’300’ を指定いるので、型は関係なく、値が ’300’ のmelonキー と値が 300 のgrapeキーが取得されました。
第三引数を指定しない場合はデフォルト値がFalseとなっているので、型の指定はされません。
では次に、第三引数にTureを入れて型を指定した場合でみてみましょう。
サンプルコード2
<?php $fruits = [ 'apple'=>'100', 'orange'=>'150', 'melon'=>'300', 'banana'=>'200', 'pineapple'=>'500', 'grape'=> 300, 'peach' => 150 ]; $fruits_key = array_keys($fruits, '300', true); print_r($fruits_key); ?>
実行結果
型を指定しているので、’300’ の値に型もぴったり合ったmelonキーのみを取得していますね。
値の型までも厳密に比較したい場合は、array_keys関数の第三引数にTrueを指定しましょう。
array_key_exists関数で配列のキーがあるか確認する
配列のキーを取得する前に、キーが本当に存在するか分からない、ということがあるかと思います。
そこでarray_key_exists関数を使って、先にキーの有無を確認する事ができます。
配列のキーがあるか心配になったら、まずはここから試してみましょう。
array_key_exists関数については、以下の記事で詳しく解説しています。
またarray関数についてもっと詳しく知りたい方、配列を操作するさまざまな関数の使い方については、以下の記事にまとめていますので、こちらもぜひ参考にしてくださいね!
速度面
array_keys関数は配列のキーを取得するときに便利ですが、速度面ではどうなのでしょうか?
ここではarray_keys関数で配列のキーを取得する方法と、foreachによるループ処理の中で配列のキーのみを取得する方法で、どちらがパフォーマンスに優れているか比較してみました。
比較にはmicrotime関数を使用し、ループの中で100000回配列の要素を追加し、配列のキーをどちらが早く取得できるか比較しています。
<?php //キーと値を100000回追加する for ($i = 0 ; $i < 100000 ; $i++){ $array[] = [$i=>'array']; } // array_keys関数によるキー取得 $start1 = microtime(true); $array_keys1 = array_keys($array); $end1 = microtime(true) - $start1; echo 'array_keys : '.$end1 .'秒'; echo '<br>'; // foreachによるキー取得 $start2 = microtime(true); foreach($array as $key => $value){ $array_keys2[] = $key; } $end2 = microtime(true) - $start2; echo 'foreach : '.$end2 .'秒'; ?>
実行結果
実行結果:1回目 array_keys : 0.00322890281677秒 foreach : 0.0219061374664秒 実行結果:2回目 array_keys : 0.00240707397461秒 foreach : 0.0243449211121秒 実行結果:3回目 array_keys : 0.0025200843811秒 foreach : 0.0264029502869秒
3回確認した結果、foreach文を使用したキー取得処理のほうが処理が遅く、array_keys関数を指定したほうが圧倒的に早いことがわかりました!
まとめ
ここでは、
- array_keys関数とは?
- 配列のキーを取得する方法
- 指定した値のキーのみを取得する方法
- 型まで指定した値のキーを取得する方法
の基本的な使い方の解説をしました。
また応用編として、配列のキーが存在するか分からない時に使うarray_key_exists関数の使い方や、速度面の検証なども説明しました。
array_keys関数は、配列の要素がいくつ合ったか、同じ値の入ったキーが幾つあるのかなどを調べる場合に非常に便利です。
もしarray_keys関数の使用方法を忘れてしまったら、この記事を思い出してくださいね!