Menu

PHPの連想配列:キーと値の追加・ループ・ソート

PHPの連想配列は、自分で名前を付けたキーの下に値を格納します:$user = ['name' => 'Ada', 'age' => 36]; は$user['name']で読めます。ペアの追加・変更・削除、キーと値のループ、すべてのキーや値の取得、キーの確認、キーや値での並べ替えを学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

連想配列は、各値を自分で選んだキーの下に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はすべてペアを追加した順番で扱います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める