連想配列は、各値を自分で選んだキーの下にkey => valueの形で格納します:$user = ['name' => 'Ada', 'age' => 36];。値は$user['name']で読み、キーに代入すれば追加や変更ができます:$user['email'] = 'ada@example.com';。
ほかの言語では、同じ構造が辞書、マップ、ハッシュなどと呼ばれます。PHPでは、キーが0, 1, 2ではなく文字列であるだけの普通の配列です。
ペアを追加・変更・削除する
存在しないキーに代入すると、末尾に追加されます。存在するキーに代入すると、位置はそのままで値が置き換わります。unset()はペアを削除します。
ここではarray_push()は役に立ちません。数値のキーで値を追加することしかできないからです。複数のペアを一度に追加するには、新しい値が優先されるarray_merge($stock, $more)か、既存のキーの値が残る$stock + $moreを使います。2つの違いはarray_mergeのページで比べています。
キーと値でループする
foreach ($array as $key => $value)は、追加された順番にペアを処理します。値だけが必要なら$key =>を省きます。
すべてのキーやすべての値を取得する
array_keys()はキーを普通のリストで返し、array_values()は値を返します。どちらも0から番号が振り直されます。array_keys()に2つ目の引数を渡すとその値を持つキーだけを返すので、ある値に対応するすべてのキーを探せます。
キーを1つだけなら、array_search()が最初に一致したキーを、なければfalseを返します。その結果を!== falseで比較しなければならない理由はarray_searchのページで説明しています。
キーが存在するか確認する
isset($arr['key'])は定番で最速の確認方法ですが、キーが存在していても値がnullならfalseを返します。その場合、array_key_exists('key', $arr)はtrueを返します。既定値付きで読むなら、??演算子が両方を一度に行います。
キーや値で並べ替える
ksort()はキーで、asort()は値で並べ替え、どちらも各キーを値と結びつけたまま保ちます。krsort()とarsort()は逆順に並べ替えます。連想配列にsort()を使ってはいけません。キーを捨てて0から番号を振り直してしまいます。
これらはすべてその場で並べ替えてtrueを返すので、$sorted = ksort($arr)で得られるのは配列ではなくtrueです。独自の順番にはuasort()とuksort()を使います。
入れ替え、集計、JSONへの変換
キーと値のデータでは、決まった1行の処理が何度も出てきます。array_flip()はキーと値を入れ替え、array_count_values()は各値が何回現れるかを数え、json_encode()は配列をJSONオブジェクトにします。
よくあるミス:存在しないキーを読む
存在しないキーを読むとnullが返りますが、自分の環境のPHPでは警告も表示されます。
<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3
決して警告を出さない??で既定値を与えるか、存在しない場合に別の処理が必要なら、先にisset()で確認します。
ダブルクォートの文字列の中では、"{$user['email']}"のように参照を波括弧で囲みます。波括弧がないと、PHPは引用符なしの"$user[email]"の形しか受け付けず、間違えやすくなります。
よくある質問
PHPで連想配列を作るには?
角括弧の中に、各ペアをkey => valueの形で書きます:$prices = ['apple' => 1.2, 'pear' => 0.9];。値は$prices['apple']で読みます。
PHPで連想配列をキーで並べ替えるには?
昇順ならksort($arr);、降順ならkrsort($arr);を呼びます。どちらもその場で並べ替え、各値をキーと結びつけたまま保ち、並べ替えた配列ではなくtrueを返します。
PHPで連想配列をループするには?
変数を2つ使ってforeachします:foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }。ペアは追加した順番に出てきます。
連想配列のすべてのキーを取得するには?
array_keys($arr)はキーをインデックス配列で返し、array_values($arr)は値を返します。array_keys($arr, $value)は、値が$valueと等しいキーだけを返します。
PHPの連想配列は追加した順番を保ちますか?
保ちます。PHPの配列は順序付きのマップなので、ksort()やasort()などの関数で並べ替えるまで、foreach、print_r、json_encodeはすべてペアを追加した順番で扱います。