PHPには値だけを格納する通常の配列の他に、キーと値とをペアにした連想配列というものがあります。この連想配列という仕組みはPHPに限らず多くのプログラミング言語で採用されており、うまく使うことによって高速で可読性の高いプログラムが実現できます。
この記事を参考にPHPでの連想配列の使い方を覚えて実際のプログラム開発に役立てていきましょう。
目次
連想配列の基本
通常の配列(Array)の仕組み
配列とは1つの変数に複数の値を格納する仕組みをいいます。変数はよく「入れ物」になぞらえることがありますが、配列は複数の入れ物が連なっているイメージを持ってもらえると良いかと思います。
あらかじめ入れ物の数を決めておいて、それぞれ割り振られた番号(インデックス)をキーに値を入れていきます。インデックスは通常0から始まります。
下図の例では配列にテストの点数を格納していると思ってください。インデックス0には98点、1には82点と、順番に値を格納していくのが配列です。
連想配列の仕組み
連想配列では、そのインデックス番号の代わりに任意の名前を付けることができます。通常の配列の場合は「インデックス0が鈴木さん」とあらかじめ覚えておいてプログラムの中で紐づけさせる必要がありますが、連想配列の場合はインデックスにその名前を付与できるのです。
以下の例では、生徒の名前の付いた連想配列にテストの点数を格納している模式図です。
キーと値が1対1の関係がある場合は、連想配列を使ったほうがプログラムがよりシンプルになると思います。連想配列をうまく使いこなすことでより効率的なプログラミングが可能になります。
連想配列の初期化([ ]とArray関数)
PHPでの連想配列の初期化には2つの方法があります。
1つは[ ]で括ったケース、もう1つはArray関数を使うケースです。どちらも同じく連想配列の初期化ができますのでお好みで選んでください。
初期化の際にはキーと値とを「=>」で組み合わせます。以下が初期化の例です。
1 2 3 4 5 |
//[ ]を使用した初期化例 $score = ["鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"]; //array関数を使用した初期化例 $score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); |
KeyからValueを出力する方法
初期化した連想配列からデータを出力する場合は以下のような構文になります。
1 |
配列変数[キー] |
こちらがプログラム例となります。
1 2 3 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); echo $score["山田"]."\n"; |
以下のように山田さんの値(点数)を出力します。
1 |
82点 |
foreachを使ったKeyとValueの出力方法
値の出力方法
foreach文を使ってすべての値を順番に出力させることができます。
以下のような構文で配列変数$scoreから順に値を$value変数に格納してくれます。
1 |
foreach($score as $value){ ... } |
以下が使用例です。
1 2 3 4 5 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); foreach($score as $value){ echo $value ."\n"; } |
出力結果はこちらです。$valueで受け取った値を順番に出力していることがわかるかと思います。
1 2 3 4 |
98点 82点 92点 100点 |
KeyとValueの出力方法
次に値だけでなくキーも出力できるようにしましょう。以下が構文となります。
1 |
foreach($score as $key => $value){ ... } |
以下が使用例です。山田さんから順番にキーと値を出力してくれます。
1 2 3 4 5 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); foreach($score as $key => $value){ echo $key ." : ". $value. "\n"; } |
出力結果は以下のとおりです。
1 2 3 4 |
鈴木 : 98点 山田 : 82点 佐藤 : 92点 池田 : 100点 |
いろいろな関数を使った応用
PHPでは連想配列に関係する便利な関数が用意されています。これらを知ることで連想配列をうまく使いこなしていきましょう。
in_array関数による値の存在確認
in_array関数で値の存在を確認することができます。
1 2 3 4 |
in_array(検索したい値, 配列変数, true) //使用例 in_array("82点", $score, true) |
もしヒットすればtrueを返してくれるので、if文との相性が良いです。以下は「82点」という値が存在しているかを確認する例です。
1 2 3 4 5 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); if(in_array("82点", $score, true)){ print "見つかりました\n"; } |
array_key_exists関数によるKeyの存在確認
array_key_exists関数でキーの存在を確認することができます。
1 2 3 4 |
array_key_exists(検索したいKey, 配列変数) //使用例 array_key_exists('佐藤', $score) |
in_array関数と同じくヒットすればtrueを返してくれます。以下は「佐藤」というキーが存在しているかを確認する例です。
1 2 3 4 5 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); if(array_key_exists('佐藤', $score)){ print "見つかりました\n"; } |
array_keys関数によるKey一覧の取得
連想配列に格納されているすべてのキーを取得したい場合はarray_keys関数を使用します。
以下は、連想配列$scoreのすべてのキーを$keysに格納した例です。$keysは通常の配列となります。
1 2 3 4 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); $keys = array_keys($score); print_r($keys); |
$keysを出力すると以下のとおりになります。
1 2 3 4 5 6 7 |
Array ( [0] => 鈴木 [1] => 山田 [2] => 佐藤 [3] => 池田 ) |
next関数、prev関数で配列ポインタを移動する
次の例は、他のプログラミング言語ではあまり見られない機能ですが、配列ポインタを順に移動してくれる関数群です。
current関数は現在の位置を示します。next関数で次の要素に移動し、prev関数で1つ戻ってくれます。
1 2 3 4 5 6 7 8 9 10 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); echo current($score). "\n"; //現在の値 echo key($score) ."\n"; //キー表示 echo next($score) ."\n"; //1個進む echo key($score) ."\n"; //キー表示 echo prev($score) ."\n"; //1個戻る echo key($score) ."\n"; //キー表示 |
以下が出力例です。鈴木さんから山田さんに進んでまた鈴木さんに戻ってくれていることがわかるかと思います。
1 2 3 4 5 6 |
98点 鈴木 82点 山田 98点 鈴木 |
これらをどのように使うかはいろいろ考えられますが、1つの例としてwhile文を使ってすべてのキーを順番に出力することができます。ただ、コメント文にもあるようにnextがないと無限ループに陥るので注意しましょう。
1 2 3 4 5 6 |
$score = array("鈴木"=>"98点", "山田"=>"82点", "佐藤"=>"92点", "池田"=>"100点"); while ( current( $score ) ) { echo key($score); ."\n"; next($score); //これがないと無限ループになるので注意 } |
こちらが出力例です。
1 2 3 4 |
鈴木 山田 佐藤 池田 |
まとめ
いかがでしょうか。
今回はPHPの連想配列の使い方の基礎について紹介しました。連想配列はデータをうまく使いこなすための便利な仕組みです。適切に利用することで効率的なプログラミングが可能になりますのでしっかり学んでいきましょう。