Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. PHP入門編 - 連想配列とは

連想配列とは

みなさまどうもおはこんばんにちわ。

PHP入門編もなんと20話目でございます。最初からここまでお読み頂いた方は大変お疲れ様です。こんな駄文をここまでお読み頂き大変嬉しゅうございます。初めて当サイトにいらっしゃった方はどうも初めまして。どうぞごゆっくりしていってください。

では続きまして『連想配列』とかいうのをやっていきましょう。『連想配列』は「れんそうはいれつ」って読みます。英語だと『ハッシュ』(hash)、または『マップ』(map)になりますね。さらに言語によっては『オブジェクト』なんて呼ばれたりしますがPHPでは『連想配列』が一般的な気がしてます。

ではまず『連想配列』とはどういうものか、というところから解説していきます。添字配列(普通の連番をインデックスとする配列)は『連番が付けられたデータの集合体』であったわけですが、『連想配列』は『独自の名前を持ったデータの集合体』のようなイメージになります。

まあ、とどのつまり配列のインデックスが数値じゃなくて文字列に変わっただけです。添字配列だと以下のような感じですよね。

<?php
$vocaloids = [];
$vocaloids[0] = '初音ミク';
$vocaloids[1] = 'IA';
$vocaloids[2] = '鏡音リン';

『連想配列』だと以下のような感じになります。

<?php
$fruits = [];
$fruits['apple'] = 'リンゴ';
$fruits['orange'] = 'オレンジ';
$fruits['grape']  = 'ブドウ';

『apple』ならば『リンゴ』、『orange』なら『オレンジ』っていう感じで文字列(名前)と値が紐付いていますね。『連想配列』は識別のための名前が数値ではなく文字列を使ってる配列って感じです。

じゃあどういう時に使うんだろう、というと「連番ではなく名前と紐付けてデータを管理したい」といった時に使用されます。

例えば「スタッフの名前と連絡先をまとめて管理したい」という状況だと『スタッフの名前』と『連絡先』を紐付ける必要がありますので、連番で管理する添字配列ではなく『連想配列』を使用したほうが構築が楽です。

ではちょっとサンプルを書いてみましょう。またもやボーカロイドのみなさんのお名前をお借りします。「各メンバーの連絡先を連想配列で保存する」となると以下のような感じになります。

<?php
$vocaloids = [];
$vocaloids['miku'] = '080-xxxx-1234';
$vocaloids['IA'] = '090-yyyy-1234';
$vocaloids['rin']  = '080-zzzz-1234';

上記の場合で『miku』ちゃんの連絡先を出力したい場合は以下となります。『連想配列』の扱い方は通常の配列とほぼ変わりません。

<?php
$vocaloids = [];
$vocaloids['miku'] = '080-xxxx-1234';
$vocaloids['IA'] = '090-yyyy-1234';
$vocaloids['rin']  = '080-zzzz-1234';

echo $vocaloids['miku']; // 『080-xxxx-1234』と出力されます。

『$vocaloids['miku']』って感じで『[]』の中に扱いたい要素の文字列を入れてあげればOKです。

『連想配列』のそれぞれのまとまりを『プロパティ』と呼び、プロパティに入ってる値はそのまま『値』と呼びます。そして各プロパティが持つ名前は『キー』、もしくは『プロパティ名』と呼びます。

<?php
$fruits['apple'] = 'リンゴ'; // この場合は『apple => リンゴ』がプロパティ、『apple』がキー、『リンゴ』が値になります。

『プロパティ』とか『プロパティ名』とか『値』とかは現場でも良く使用される言葉なので覚えておきましょう。

ちなみにプロパティ名(キー)のことを配列と同じように「インデックス」と呼んでしまったり、プロパティのことを「要素」と呼んでしまってもOKです。言語によって使ってる言葉が違うだけのお話で指してるものは同じなのでございます。

そして、添字配列と同じく『[]』の中に変数とか式とかを入れることができます。以下は『[]』の中で変数展開と文字連結をさせたパターンです。かなり荒業に見えますがこんな実装もできちゃいます。

<?php
$vocaloids = [];
$vocaloids['miku'] = '080-xxxx-1234';
$vocaloids['IA'] = '090-yyyy-1234';
$vocaloids['rin']  = '080-zzzz-1234';

$txt = 'mi';

echo $vocaloids[$txt . 'ku']; // 『080-xxxx-1234』と出力されます。

ここまでは大丈夫そうでしょうか。さて、ではPHPでの配列と連想配列の注意点を確認していきましょう。前の記事でも解説しましたが、PHPでは添字配列と『連想配列』は同じものとして扱われています。なので添字配列と『連想配列』をいっしょくたにすることができちゃいます。

<?php
$vocaloids = [];
$vocaloids[] = '初音ミク';
$vocaloids[1] = 'IA';
$vocaloids['miku'] = '080-xxxx-1234';
$vocaloids['IA'] = '090-yyyy-1234';
$vocaloids['rin']  = '080-zzzz-1234';

var_dump($vocaloids);

これを実行させるとこうなります。

array(5) {
  [0]=>
  string(12) "初音ミク"
  [1]=>
  string(2) "IA"
  ["miku"]=>
  string(13) "080-xxxx-1234"
  ["IA"]=>
  string(13) "090-yyyy-1234"
  ["rin"]=>
  string(13) "080-zzzz-1234"
}

まったく問題なく実行できてしまっていますね。なので配列を添字配列として扱うのか、それとも『連想配列』として扱うのかはプログラマーがしっかり管理していく必要があります。この挙動は他の言語に精通している方だとかなり戸惑ってしまうかもしれません。気をつけるようにしてください。

さらにPHPでの配列全般では生成したプロパティ(要素)の順番が必ず担保されます。ちょっと以下の例を見てください。

<?php
$vocaloids['miku'] = '080-xxxx-1234';
$vocaloids['IA'] = '090-yyyy-1234';
$vocaloids['rin']  = '080-zzzz-1234';

var_dump($vocaloids);

これを実行させるとこうなります。

array(3) {
  ["miku"]=>
  string(13) "080-xxxx-1234"
  ["IA"]=>
  string(13) "090-yyyy-1234"
  ["rin"]=>
  string(13) "080-zzzz-1234"
}

ちゃんと追加した順番で出力されているのが確認できたと思います。

さて、この順番が担保される、というのは内部的に『連想配列』と同じものとして扱われてる添字配列でも同じです。ということはインデックス番号の順番でなく、要素を追加した順番で配列が生成されているということになります。

ちょっと試してみましょう。以下はわざと添字配列のインデックス番号をバラバラにして要素を生成したサンプルです。

<?php
$vocaloids[5] = '初音ミク';
$vocaloids[1] = 'IA';
$vocaloids[3] = '鏡音リン';

var_dump($vocaloids);

これを実行させるとこうなります。

array(3) {
  [5]=>
  string(12) "初音ミク"
  [1]=>
  string(2) "IA"
  [3]=>
  string(12) "鏡音リン"
}

インデックス番号が低い順ではなく、生成した順番で出力されていますね。『連想配列』ならば生成した順番が担保されるというのは非常に心強いのですが、添字配列だとちょっと不思議な感じがしますよね。

添字配列を使用する処理は後で紹介する『for文』と組み合わせることが多いので実装ではあまり影響がでないと思いますが、この挙動は覚えておくようにしてください。あとインデックス番号をかっ飛ばしたりしても怒られない、というのも要注意です。思わぬミスの原因になりがちなので気をつけるようにしてください。

基本的にPHPでの『連想配列』に『キー』として使用できるのは文字列と整数のみとなっています。

一応『true』とか『false』とか『3.14』とかでも生成できるのですが『true』は『1』、『false』は『0』、『3.14』は小数点以下切り捨てされて『3』と勝手に変換されたりするので危なっかしくてしょうがないです。なので使わないほうが無難です。

<?php
$test[0] = 'hoge';
$test[false] = 'hoge1'; // 『false』は『0』と解釈されるので上書きされます。

$test[1] = 'fuga';
$test[1.21] = 'fuga1'; // 『1.21』は小数点以下切り捨てで『1』となるので上書きされます。

というわけで『連想配列』の基本的なところについては以上となります。続いての記事ではダブルアロー演算子を使ってまたもや『連想配列』をこにょこにょやっていきましょう。

ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。