PHPの配列は、値のリストをキーの下に格納します。角括弧で作り($fruits = ['apple', 'banana', 'cherry'];)、要素は添字で読みます($fruits[0])。添字は0から始まり、count($fruits)で要素数がわかります。
PHPの配列はすべて順序付きのマップで、各値はキーの下にあります。キーを選ばなければPHPが0, 1, 2...と番号を振り、インデックス配列になります。自分でキーを選べば(['name' => 'Ada'])、連想配列になります。どちらも同じarray型です。
配列を作る
ふつうは角括弧の構文を使います。array()は古い書き方で、まったく同じものを作ります。range()は数字や文字のリストを作り、array_fill()は1つの値を繰り返します。
PHPの配列は、ほかの配列も含め、異なる型の値を同時に持てます。配列の配列は多次元配列で、データの行を持つときの定番の方法です。
最初と最後の要素を取得する
PHPには負の添字がありません。$arr[-1]は「最後の要素」という意味ではなく、-1という名前のキーを探し、それがなければWarning: Undefined array key -1を表示します。キーが0から始まらない場合にも使えるarray_key_first()とarray_key_last()を使いましょう。
end($queue)も最後の値を返しますが、副作用として配列の内部ポインターを動かすので、キーを使う方法のほうがわかりやすい選択です。
配列を出力する
echo $arrは動きません。Arrayという単語と警告を表示します。目的に合った出力方法を選びましょう。
print_r($arr):デバッグ中に読みやすく表示する。var_dump($arr):各値の型と長さも見る。implode(', ', $arr):表示用に値を1つの文字列にする。json_encode($arr):配列をJavaScriptやAPIに送る。
HTMLの中で配列を出力する方法を含む書式のオプションは、print_rとvar_dumpのページで扱っています。
配列をループする
foreachは配列のために作られたループで、各値を、求めればキーも渡してくれます。添字を使うforループも、キーが0から欠番なく続くインデックス配列なら使えます。
配列は共有されずにコピーされる
配列を別の変数に代入したり、関数に渡したりするとコピーが渡されます。コピーを変えても元の配列はそのままです。関数で呼び出し元の配列を変えたいときは、引数に&を付けます。
目的別の配列関数
PHPには70以上の配列関数があります。よく使うのは次のもので、それぞれに専用のページがあります。
| やりたいこと | 関数 |
|---|---|
| 末尾に追加する | array_push()または$arr[] = |
| 要素数 | count() |
| 値が存在するか確認する | in_array() |
| 値のキーを探す | array_search() |
| キーが存在するか確認する | array_key_exists() |
| 配列を結合する | array_merge() |
| すべての値を変換する | array_map() |
| 一部の値を残す | array_filter() |
| 並べ替える | sort()、usort()など |
| 要素を削除する | unset(), array_splice() |
| 一部を取り出す | array_slice() |
| 重複を取り除く | array_unique() |
| 文字列と配列の相互変換 | explode(), implode() |
黙ってまとめられてしまうキー
配列のキーは整数か文字列で、PHPは一部のキーを自動で変換します。"1"のように整数の10進表記に見える文字列は整数の1になるので、$a["1"]と$a[1]は同じ場所です。"01"と"1.5"は文字列のままです。フォームの入力やCSVから作った配列の要素数が予想より少なくなることがあるのは、このためです。
よくある質問
PHPで配列を作るには?
角括弧を使います:$colors = ['red', 'green', 'blue'];。空の配列は$items = [];です。古いarray('red', 'green')構文も同じことをし、今でも動きます。
PHPで配列を出力するには?
echoでは配列を出力できません(Arrayという単語と警告が表示されます)。読みやすく表示するにはprint_r($arr)、型も見るにはvar_dump($arr)、値を1行で出力するにはecho implode(', ', $arr)を使います。
PHPで配列の最後の要素を取得するには?
$arr[array_key_last($arr)](PHP 7.3以降)かend($arr)を使います。PHPには負の添字がありません:$arr[-1]は-1という名前のキーを探し、たいていそれは存在しません。
PHPの配列は値渡しですか、参照渡しですか?
値渡しです。$b = $a;で$bは自分のコピーを持つので、$bを変えても$aは変わりません。関数の中で呼び出し元の配列を変更するには、引数を参照として宣言します:function add(array &$list)。
PHPのインデックス配列と連想配列の違いは何ですか?
同じ型です。インデックス配列はPHPが割り当てる整数のキー0, 1, 2...を持ち、連想配列は自分で選んだキー(たいてい'name'のような文字列)を使います。1つの配列で両方を混ぜることもできます。