PHPのarray(配列)型

PHPで配列を扱うには、array型を使用します。PHPでは、0からの連続した整数をキーとする「添字配列」と文字列をキーとする「連想配列」に型としての区別はなく、どちらもarray型として扱われます。そのため、添字配列と連想配列を混ぜて扱うことができ、連想配列であっても順序が保証されるという特徴があります。

添字配列

PHPで配列を初期化するには、array()を使用します。array()では、引数に格納する要素をカンマ区切りで列挙します。その際に最後の要素の後ろにカンマを記述してもPHPではエラーになりません。また、ブラケット"[]"を使って要素を追加することができます。その際にキーを省略すると配列の最後に要素が追加されます。

配列の要素にアクセスするには、変数にブラケットを付けてキーを指定します。PHPでは、下記コードのように1つの配列に異なる型の値を格納しても問題ありません。

PHP

<?php
$array_00 = array('a', 1,);
$array_00[2] = 1.1;
$array_00[] = false;
var_dump($array_00[0]); // 出力:string(1) "a"
var_dump($array_00[1]); // 出力:int(1)
var_dump($array_00[2]); // 出力:float(1.1)
var_dump($array_00[3]); // 出力:bool(false)
?>

また、PHPでは初期化されていない変数であれば、ブラケット"[]"を使って、配列として初期化することができます。他の型で初期化された変数をブラケット"[]"で初期化しようとするとE_WARNINGの警告が発生し、配列は作成されないので注意が必要です。

PHP

<?php
$array_01[] = 'a';
var_dump($array_01); // 出力:array(1) { [0]=> string(1) "a" }

$array_02 = 1;
$array_02[] = 'b';
var_dump($array_02); // 出力:int(1)(E_WARNING発生)
?>

連想配列

連想配列は、配列のキーに添字(整数)ではなく、文字列を使用します。array()で初期化する際に ‘キー’ => 値 の形式で要素を列挙します。ブラケット"[]"を使って要素を追加する際は、キーに文字列を使用します。また、配列の要素にアクセスする際もキーに文字列を指定します。

PHP

<?php
$array_03 = array(
  'a' => 0,
  'b' => 1,
);
$array_03['c'] = 2;
var_dump($array_03['a']); // 出力:int(0)
var_dump($array_03['b']); // 出力:int(1)
var_dump($array_03['c']); // 出力:int(2)
?>

PHPでは、添字配列と連想配列は型として区別されないので、下記のように混在させることも可能です。注意するべき点は、整数を文字列として指定しても整数と解釈される点です。下記コードでは、’0’をキーとして要素を追加しようとしていますが、結果として0番目の要素が上書きされています。

PHP

<?php
$array_04 = array(
  0,
  'foo' => 1,
);
$array_04[] = 2;
$array_04['hoge'] = 3;
$array_04['0'] = 100;
var_dump($array_04); // 出力:array(4) { [0]=> int(100) ["foo"]=> int(1) [1]=> int(2) ["hoge"]=> int(3) }
?>

多次元配列

配列の要素に配列を格納することにより、多次元配列を定義することができます。多次元配列をarray()で初期化する際には、array()を入れ子にします。また、ブラケット"[]"で各階層のキーを指定することで多次元配列の要素にアクセスできます。

PHP

<?php
$array_05 = array(
  'Mac' => array(
    'OS' => 'Mac OS X',
    'version' => 10.7,
  ),
  'Win' => array(
    'OS' => 'Windows',
    'version' => 7.0,
  ),
);
$array_05['Mac']['manufacturer'] = 'Apple';
$array_05['Win']['manufacturer'] = 'Microsoft';
var_dump($array_05['Mac']['OS']); // 出力:string(8) "Mac OS X"
var_dump($array_05['Mac']['version']); // 出力:float(10.7)
var_dump($array_05['Mac']['manufacturer']); // 出力:string(5) "Apple"
var_dump($array_05['Win']['OS']); // 出力:string(7) "Windows"
var_dump($array_05['Win']['version']); // 出力:float(7)
var_dump($array_05['Win']['manufacturer']); // 出力:string(9) "Microsoft"
?>

配列のキーとして指定できる値

配列のキーとして指定できる値は、整数と文字列です。論理型、浮動小数点型、NULL型を指定してもエラーにはなりませんが、論理型のfalseは0、論理型のtrueは1、浮動小数点型は小数点以下が切り捨てられた整数、NULLは空文字列として扱われます。すでに定義済みの要素があった場合は、上書きされますので使うべきではないでしょう。

PHP

<?php
$array_06 = array(
  0,
  1,
  2,
  '' => 3,
);
$array_06[false] = 'false';
$array_06[true] = 'true';
$array_06[2.1] = 'float';
$array_06[NULL] = 'null';
var_dump($array_06[0]); // 出力:string(5) "false"
var_dump($array_06[1]); // 出力:string(4) "true"
var_dump($array_06[2]); // 出力:string(5) "float"
var_dump($array_06['']); // 出力:string(4) "null"
?>

配列の要素の削除

配列の要素を削除するには、unset()を使います。下記コードでは、unset()したキーが存在するかをarray_key_exists()によって調べていますが、falseが返されていることが確認できます。また、配列自体を削除したい場合もunset()を使います。

PHP

<?php
$array_07 = array(0, 1);
var_dump(array_key_exists(0, $array_07)); // 出力:bool(true)
unset($array_07[0]);
var_dump(array_key_exists(0, $array_07)); // 出力:bool(false)
unset($array_07);
var_dump(isset($array_07)); // 出力:bool(false)
?>

配列の結合

配列は、加算演算子を使用して結合することができます。結合する配列が同じキーを持っている場合は、左側の配列が優先されます。下記の例では、2つの配列を結合していますが、左右を入れ替えると演算の結果も異なることが確認できます。

PHP

<?php
$array_08 = array('foo' => 0, 'hoge' => 1, 'bar' => 2);
$array_09 = array('foo' => 'a', 'hoge' => 'b');
var_dump($array_08 + $array_09); // 出力:array(3) { ["foo"]=> int(0) ["hoge"]=> int(1) ["bar"]=> int(2) }
var_dump($array_09 + $array_08); // 出力:array(3) { ["foo"]=> string(1) "a" ["hoge"]=> string(1) "b" ["bar"]=> int(2) }
?>

配列の比較

配列の比較演算では、同じキーと値を持っている場合に等しいとみなされます。しかし、厳密な比較演算では、同じキーと値を持ち、且つ並び順も同じ場合に等しいとみなされます。

PHP

<?php
$array_10 = array('foo' => 'a', 'hoge' => 'b', 'bar' => 'c');
$array_11 = array('foo' => 'a', 'bar' => 'c', 'hoge' => 'b');
var_dump($array_10 == $array_11); // 出力:bool(true)
var_dump($array_10 != $array_11); // 出力:bool(false)
var_dump($array_10 === $array_11); // 出力:bool(false)
var_dump($array_10 !== $array_11); // 出力:bool(true)
?>