PHPでは配列を使った便利な機能がたくさんあります。その中で今回は配列のキーを取得するarray_keys関数について解説します。
PHP初学者からすれば、array_keys関数は連想配列のキー一覧を取得する関数として認知されていると思います。もちろん連想配列のキー一覧を取得するための関数ではありますが、それはarray_keys関数の持つ能力の一部でしかありません。使い方次第でプログラムの効率は格段に上がるものなので、ぜひarray_keys関数についてマスターしましょう。
目次
array_keys関数の基本
まずは、array_keys関数の基本についてです。キーを取得するための関数なので主に連想配列で使うものですが通常の配列でもちゃんと機能します。通常の配列と連想配列それぞれの挙動を押さえておきましょう。
通常の配列の場合
以下が通常の配列の例です。$memberという5人の名前を有した配列からarray_keys関数でキーを出力してみます。
1 2 3 |
$member = array("鈴木一郎", "山田太郎", "渡辺隆", "池田花子", "佐藤清"); print_r(array_keys($member)); |
結果は以下のとおりです。通常の配列ではキーは存在しないものの要素番号(インデックス)を得ることができます。
1 2 3 4 5 6 7 8 |
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 ) |
連想配列の場合
次に連想配列についてです。以下のように名前をキーに、そこに付与した数値(年齢のつもりです)を値としています。これをarray_keys関数でキーを出力してみましょう。
1 2 3 |
$member = array("鈴木一郎"=>28, "山田太郎"=>33, "渡辺隆"=>41, "池田花子"=>33, "佐藤清"=>21); print_r(array_keys($member)); |
結果はご覧の通りです。キーである各名前が出力されました。
1 2 3 4 5 6 7 8 |
Array ( [0] => 鈴木一郎 [1] => 山田太郎 [2] => 渡辺隆 [3] => 池田花子 [4] => 佐藤清 ) |
以上がarray_keys関数の基本的な使い方になります。
特定の値を持ったキーだけを取得する方法
array_keys関数の面白い機能として、特定の値を持ったキーを取得できます。
例えば、以下の連想配列の中から33歳の人のみ抽出したい場合は、第二引数にその値(以下の例では33)を指定することができます。
1 2 3 |
$member = array("鈴木一郎"=>28, "山田太郎"=>33, "渡辺隆"=>41, "池田花子"=>33, "佐藤清"=>21); print_r(array_keys($member,33)); |
ご覧の通り33歳の人のみが抽出できました。
1 2 3 4 5 |
Array ( [0] => 山田太郎 [1] => 池田花子 ) |
この機能で1点注意いただきたいのが、値が”33″と文字列であってもヒットしてしまうという点です。以下のように33という数値を持っているのは厳密には山田太郎さんしかいません。池田花子さんは”33″という文字列です。
1 2 3 |
$member = array("鈴木一郎"=>28, "山田太郎"=>33, "渡辺隆"=>41, "池田花子"=>"33", "佐藤清"=>21); print_r(array_keys($member,33)); |
しかし、結果はどちらもヒットしてしまいます。文字列”33″も自動で数値変換してしまうからです。
1 2 3 4 5 |
Array ( [0] => 山田太郎 [1] => 池田花子 ) |
これを区別したい場合は、第三引数にtrueを指定します。
1 2 3 |
$member = array("鈴木一郎"=>28, "山田太郎"=>33, "渡辺隆"=>41, "池田花子"=>"33", "佐藤清"=>21); print_r(array_keys($member,33, true)); |
これによって数値のみを判定してくれます。
1 2 3 4 |
Array ( [0] => 山田太郎 ) |
array_keys関数は単純にキー一覧を得るだけでなく特定の値で検索できることがおわかりいただけたでしょうか。
多次元配列でarray_keys関数の使いどころ
次に多次元配列での使い方について触れていきたいと思います。
以下のようにキーを名前に、値に配列を持った多次元配列を使ったarray_keys関数の使いどころを紹介します。
1 2 3 4 5 6 7 |
$member = array("鈴木一郎" => array("age"=>28, "address"=>"東京都", "tel"=>"03-1111-1111"), "山田太郎" => array("age"=>33, "address"=>"大阪府", "tel"=>"06-2222-1111"), "渡辺隆" => array("age"=>41, "address"=>"北海道", "tel"=>"011-333-1111"), "池田花子" => array("age"=>33, "address"=>"愛知県", "tel"=>"052-444-1111"), "佐藤清" => array("age"=>21, "address"=>"福岡県", "tel"=>"092-555-1111") ); print_r(array_keys($member)); |
単純にarray_keys関数でキーを出力すると以下の結果となります。
1 2 3 4 5 6 7 8 |
Array ( [0] => 鈴木一郎 [1] => 山田太郎 [2] => 渡辺隆 [3] => 池田花子 [4] => 佐藤清 ) |
array_keys関数を用いてforeachで順にキーを取得し、そのキーに紐付いている値(配列)をまたarray_keys関数で順に抽出していくプログラムを作りました。
1 2 3 4 5 6 |
foreach(array_keys($member) as $k0){ echo $k0 . "\n"; foreach(array_keys($member[$k0]) as $k1){ echo "\t". $k1 ." : ". $member[$k0][$k1]. "\n"; } } |
結果は以下の通りです。array_keys関数を使うことによって多次元配列のような複雑なデータも簡単に処理できるわけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
鈴木一郎 age : 28 address : 東京都 tel : 03-1111-1111 山田太郎 age : 33 address : 大阪府 tel : 06-2222-1111 渡辺隆 age : 41 address : 北海道 tel : 011-333-1111 池田花子 age : 33 address : 愛知県 tel : 052-444-1111 佐藤清 age : 21 address : 福岡県 tel : 092-555-1111 |
(実践)郵便番号から住所を検索するプログラムを作ろう
最後にもう少し実践的な使い方について紹介したいと思います。
それは、Webフォームなどでよく見かける郵便番号から住所を自動で取得するプログラムです。住所と郵便番号を有した連想配列からarray_keys関数で郵便番号から住所を高速に検索するプログラムを作ることができます。
まず住所データですが、日本郵政の公式サイトから郵便番号データをダウンロードしました。以下のようなデータ構造になっています。3列目(赤枠)が郵便番号でこれをキーにします。また、6〜8列目(青枠)を連結して1つの住所データにして連想配列の値とします。
こちらが郵便番号から住所を検索するソースコードになります。前段でCSVファイルを読み込んで連想配列化しています。その後に郵便番号の入力を促し入力された郵便番号から住所を検索という流れになっています。細かいところはコメントで解説を入れているので参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$filename = 'KEN_ALL.CSV'; //CSVファイルの読み込み $fp = fopen($filename, 'r'); while (!feof($fp)) { $txt = fgets($fp); //カンマで分割して配列に $list = explode(",", $txt); //要素数が9未満であればスキップ if(count($list)<9) continue; //要素No6〜8(住所)を連結したものをキーに $key = $list[6] . $list[7] . $list[8]; //要素No2(郵便番号)を値に $address[$key] = $list[2]; } fclose($fp); //0が入力されるまでループ while(true){ echo '郵便番号: '; //郵便番号の入力 $zip = trim(fgets(STDIN)); //0が入力されたら終了 if($zip==0) break; //入力された郵便番号から住所を検索 $key = array_keys($address, $zip); //住所を出力 print_r($key); } |
以下は実行例です。郵便番号を入力すると住所が現れます。0入力で処理が終わります。
1 2 3 4 5 6 7 8 9 10 11 |
郵便番号: 9498611 Array ( [0] => 新潟県十日町市中条丁 ) 郵便番号: 4540945 Array ( [0] => 愛知県名古屋市中川区下之一色町 ) 郵便番号: 0 |
あくまで一例ですが、こんな使い方もあるということをわかっていただけたと思います。
まとめ
いかがでしょうか。配列のキーを取得するarray_keys関数の基本から応用編として検索機能について解説しました。
単純な連想配列のキー一覧の取得だけでなく検索機能もあることで様々な使いみちを思い浮かべたのではないでしょうか。
ぜひマスターしてプログラム開発に役立ててください。