概要
PHPの配列は連想配列と同じで、連想配列のキーが整数で連続しているものが配列として扱われる。
配列
リテラル定義と追加
リテラル定義
配列をリテラルで定義すると、各要素に対して0から順番にインデックスが与えられる。
1 2 3 4 |
$a = [2, 4, 6]; var_dump($a); // array(3) { [0]=> int(2) [1]=> int(4) [2]=> int(6) } |
要素の追加
一度定義された配列に、未設定のインデックスで値を与えると、要素が付け加わえられる。
1 2 3 4 |
$a[3] = 8; var_dump($a); // array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) } |
追加の不連続性
インデックスを飛ばして要素を加えた場合、抜かされたインデックスの要素は飛ばされて新たな要素が付け加えられる(以下の例では3番要素の後に5番要素が加えられ、4番要素は存在していない)。
1 2 3 4 |
$a[5] = 12; var_dump($a); // array(5) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) [5]=> int(12) } |
再定義による上書き
定義済みの配列変数にリテラルで再定義すると、前の内容は破棄されて上書きされる。
1 2 3 4 |
$a = [3, 6, 9]; var_dump($a); // array(3) { [0]=> int(3) [1]=> int(6) [2]=> int(9) } |
インデックスによる定義・追加
未定義の変数へのインデックスによる定義
未定義の変数にインデックスで値を与えると配列として定義される。
1 2 3 4 |
$b[0] = 10; var_dump($b); // array(1) { [0]=> int(10) } |
インデックスによる追加
インデックスが飛んでいてもそのまま追加される。飛ばされた要素が埋められることはない。
1 2 3 4 |
$b[2] = 12; var_dump($b); // array(2) { [0]=> int(10) [2]=> int(12) } |
追加の不連続性
中抜けになっているインデックスで要素を定義した場合、インデックスは整列せず後ろに付け加えられる。
1 2 3 4 |
$b[1] = 11; var_dump($b); // array(3) { [0]=> int(10) [2]=> int(12) [1]=> int(11) } |
値の型の混在
値にintやstringなど異なる方が混在してもよい。
1 2 3 4 |
$b[3] = 'thirteen'; var_dump($b); // array(4) { [0]=> int(10) [2]=> int(12) [1]=> int(11) [3]=> string(8) "thirteen" } |
空の配列への順次追加
空の配列を準備し、順次要素を追加する手順。
- 変数に空の配列[]を定義する
- キーを指定せず
変数名[]=値
で順次代入
1 2 3 4 5 6 7 8 9 10 11 12 |
$a = []; $a[] = 'zero'; $a[] = 'one'; $a[] = 2; $a[] = 3; var_dump($a); // array (size=4) // 0 => string 'zero' (length=4) // 1 => string 'one' (length=3) // 2 => int 2 // 3 => int 3 |
連想配列
リテラル定義と追加
リテラル定義
キーと配列を=>で結んだリテラルで連想配列を定義。値に異なる方が混在してもよい。
1 2 3 |
$a = ['one' => 1, 'two' => 2.0, 'three' => '三']; var_dump($a); // array(3) { ["one"]=> int(1) ["two"]=> float(2) ["three"]=> string(3) "三" } |
キー指定による追加
キーを指定して末尾に要素を追加。
1 2 3 4 |
$a['four'] = 4; var_dump($a); //array(4) { ["one"]=> int(1) ["two"]=> float(2) ["three"]=> string(3) "三" ["four"]=> int(4) } |
キーによる定義・追加
未定義の変数にキーを指定して値を与えると連想配列として定義される。
1 2 3 4 |
$c['alpha'] = 'a'; var_dump($c); // array(1) { ["alpha"]=> string(1) "a" } |
定義済みの連想配列にキーと値を指定して要素を追加。キーの型も混在してよい。
1 2 3 4 |
$c[3] = 'third'; var_dump($c); // array(2) { ["alpha"]=> string(1) "a" [3]=> string(5) "third" } |
配列・連想配列のサイズ
count()
関数の引数に配列や連想配列を指定して、サイズを取得する。
count(配列・連想配列)
配列・連想配列の存在確認
- 配列の要素の存在確認は
in_array()
- 連想配列の値の存在確認は
in_array()
- 連想配列のキーの存在確認は
array_key_exists()
配列の要素を削除する
配列の先頭・末尾・部分配列
破壊的な抜き取り・追加
配列要素の抜き取り・追加にはshift()/unshift()
やpush()/pop()
を使う。それらの方法はここちら
非破壊的な取出し
非破壊的に配列や連想配列の先頭・末尾・部分配列を取り出す方法はこちらを参照。
配列の代入はディープコピー
1次元配列を代入すると、参照ではなく新たな配列としてコピーされる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$a = [1, 2, 3]; $b = $a; $a[0] = -1; echo '<pre>'; print_r($a); print_r($b); echo '</pre>'; // Array // ( // [0] => -1 // [1] => 2 // [2] => 3 // ) // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // ) |
多次元配列の子要素の内容までコピーされる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$a = [[1, 2], [3, 4]]; $b = $a; $a[0][0] = -1; echo '<pre>'; print_r($a); print_r($b); echo '</pre>'; // Array // ( // [0] => Array // ( // [0] => -1 // [1] => 2 // ) // // [1] => Array // ( // [0] => 3 // [1] => 4 // ) // // ) // Array // ( // [0] => Array // ( // [0] => 1 // [1] => 2 // ) // // [1] => Array // ( // [0] => 3 // [1] => 4 // ) // // ) |
配列と連想配列
配列と連想配列の関係
- PHPの配列と連想配列は同じもの
- 連想配列のキーが整数のみで連続しているものが配列
- 連想配列も配列も値の型は混在可能
- 連想配列のキーも型の混在が可能
2つの配列から連想配列をつくる
array_combine()
関数は2つの配列を引数にとり、第1引数をキー、第2引数を値とした連想配列を返す。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$a = ['one', 'two', 'three']; $b = [1, 2, 3]; $x = array_combine($a, $b); print_r($x); // Array // ( // [one] => 1 // [two] => 2 // [three] => 3 // ) |
第2引数に連想配列を指定すると、その値が取り出されて使われる。配列を要素とする連想配列にはならない。
1 2 3 4 5 6 7 8 9 10 11 12 |
$c = ['first', 'second', 'third']; $y = array_combine($c, $x); print_r($y); // Array // ( // [first] => 1 // [second] => 2 // [third] => 3 // ) |
2次元の連想配列から列を取り出す
array_column()関数は2つの引数をとり、第1引数に指定した2次元の連想配列から第2引数で指定したキーの列を取り出す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
$a = ['id' => 1, 'name' => 'abc', 'value' => 10]; $b = ['id' => 2, 'name' => 'def', 'value' => 20]; $c = ['id' => 3, 'name' => 'ghi', 'value' => 30]; $array[] = $a; $array[] = $b; $array[] = $c; print_r($array); print_r(array_column($array, 'id')); print_r(array_column($array, 'name')); print_r(array_column($array, 'value')); // Array // ( // [0] => Array // ( // [id] => 1 // [name] => abc // [value] => 10 // ) // // [1] => Array // ( // [id] => 2 // [name] => def // [value] => 20 // ) // // [2] => Array // ( // [id] => 3 // [name] => ghi // [value] => 30 // ) // // ) // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // ) // Array // ( // [0] => abc // [1] => def // [2] => ghi // ) // Array // ( // [0] => 10 // [1] => 20 // [2] => 30 // ) |
配列の操作
- array_unique~配列要素の重複を除く
- array_shuffle~配列要素をシャッフルする
- array_map~配列要素への関数の適用