配列
PHP の配列は、実際には順番付けられたマップです。マップは型の一種で、
値 をキー に関連付けます。
この型は、いくつかの手法で最適化されます。このため、
実際の配列またはリスト (ベクトル)、(あるマップの実装である)
ハッシュテーブル、ディレクトリ、コレクション、スタック、
キュー等として使用することが可能です。
PHP の配列には他の PHP 配列を値として保持することができるため、
非常に簡単にツリー構造を表現することが可能です。
これらのデータ構造に関する説明は本マニュアルの範囲外ですが、
これらの構造に各々に関する例を少なくとも一つ見付けることが可能です。
この分野は広範囲にまたがるので、
より詳細な情報については他の書籍を参照ください。
構文
配列 は、言語に組み込まれた
array() で作成することが可能です。この構造は、
特定の数のカンマで区切られた
key => value の組を引数とします。
array( key => value
, ...
)
// key は、 文字列 または
// 非負の 整数 です。
// value に制約はありません.
key は、 整数 または
文字列 です。
あるキーが、 整数 の標準的な表現形式である場合、
そのように解釈されます (つまり、"8" は
8 として解釈されます。一方、
"08" は "08" として解釈されます)。
key に浮動小数点数値を指定すると、
その値は integer に切り詰められます。
PHP においては添字配列と連想配列の間に違いはなく、配列型は 1 つだけで、
整数または文字列のインデックスを使用することができます。
値には、PHP の全ての型を使用することができます。
注意 :
配列に定義されていないキーへアクセスしたときの挙動は、
未定義の変数にアクセスしたときと同じです。
E_NOTICE メッセージが発行され、
返される結果は NULL となります。
キーを省略した場合、整数添字の最大値が使用され、
新しいキーはその最大値 +1 となります。整数値は負の数とすることができ、
負の添字についても同様となります。例えば、最高時の添字が -6
の場合、次のキーは -5 となります。
整数添字がまだ存在しない場合、キーは 0 (ゼロ) となります。
値が既に代入されているキーを指定した場合、元の値は上書きされます。
警告
PHP 4.3.0 以降、上記のような添字生成動作は変更されました。
現在では、配列に追加する際に、その配列の最大添字が負である場合は
次の添字はゼロ (0 ) となります。
以前は、正の添字の場合と同様に新しい添字は最大添字に +1
したものにセットされていました。
キーとして TRUE を使用した場合、
整数 型の 1 がキーとして解釈されます。
キーとして FALSE を使用した場合、
整数 型の 0 がキーとして解釈されます。
キーとして NULL を使用した場合、
空の文字列として評価されます。キーとして空の文字列を使用すると、
空の文字列のキーとその値を作成 (または上書き) します。
空の括弧を用いた場合と同じではありません。
配列またはオブジェクトをキーとして使用することはできません。
これを行なうと、warning: Illegal offset type
が発生します。
角括弧構文で作成/修正
明示的に値を設定することにより、既存の配列を修正することも可能です。
これは、角括弧の中にキーを指定し、配列に値を代入することにより行います。
キーを省略することも可能です。この場合、空の角括弧
("[] ") の変数名として追加してください。
$arr[key ] = value ;
$arr[] = value ;
// key は 文字列 または
// 非負の 整数 のどちらかです。
// value は何でもかまいません
$arr がまだ存在しない場合、作成されます。
配列を指定する別の手段でもあります。ある値を変更するには、
新しい値に値を代入します。特定のキー/値の組を削除したい場合には、
unset() を使用する必要があります。
注意 :
上記のように、キーを省略して新規要素を追加する場合、
追加される数値添字は、使用されている添字の最大値 +1 になります。
まだ数値添字が存在しない場合は、添字は 0
(ゼロ) となります。
警告
PHP 4.3.0 以降、上記のような添字生成動作は変更されました。
現在では、配列に追加する際に、
その配列の最大添字が負である場合は次の添え字はゼロ
(0 ) となります。
以前は、正の添字の場合と同様に新しい添字は最大添字に +1
したものがセットされました。
次のキー生成において、オフセットとして使われる整数値
(添字の最大値) に対応するエントリーが、
必ずしも配列内に存在するわけではないことに注意してください。
しかし、その値は、多くの場合、
配列にある整数のキー値の最大値と等しいはずです。以下に例を示します。
有用な関数
配列で使用する便利な関数がたくさんあります。
配列関数 の節を参照ください。
注意 :
unset() 関数は配列のキーを削除することが出来ます。
ただし、これによってインデックスの再構築が行われるわけではないことに
注意してください。
"通常の整数添字" (0 から始まり、1 つずつ増加) のみを使用している場合、
array_values()
を用いてインデックスを再構築することができます。
配列専用の制御構造として foreach があります。
この構造は、配列の要素に簡単に連続的にアクセスする手段を提供します。
配列ですべきこととしてはならないこと
なぜ、$foo[bar] は使用できないのか?
連想配列の添字の前後は常に引用符で括る必要があります。
例えば、$foo[bar] ではなく $foo['bar'] を使用してください。
しかし、$foo[bar] はなぜ誤りなのでしょうか?
古いスクリプトで次のような構文を見たことがあるかもしれません。
これは間違っていますが、動作します。では、なぜ間違っているのでしょう?
その理由は、このコードには文字列 ('bar' - 引用符で括られている)
ではなく未定義の定数 (bar) が使用されており、PHP
が同じ名前の定数を不幸にして同じコードの中に定義する可能性があるためです。
下位互換性の維持のため、未定義の定数は同じ名前の文字列に自動的に変換されます。
そのため、このコードは動作します。
例えば、bar という名前の定義されていない定数があるとすると、
PHP は 'bar' という文字列でそれを置換して使用します。
注意 :
これは、添字を常に クォートするという意味ではありません。
定数 や
変数
を添字として使う際には、クォートしてしまうと PHP
はそれを解釈できなくなってしまいます。
上の例の出力は以下となります。
Checking 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
Bad:
Good: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
Bad:
Good: 1
Checking 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
Bad:
Good: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
Bad:
Good: 2
この具体例を以下に示します。
error_reporting() で
(E_ALL を指定する等により)
E_NOTICE レベルのエラー出力を有効にした場合、
上記のエラーが出力されます。
デフォルトでは、
error_reporting はこれらを表示しない設定になっています。
構文 の節に記述したように、角括弧
('[ ' および '] ')
の間には、式がなければなりません。これは、
次のように書くことが可能であることを意味します。
これは、関数の戻り値を配列の添字として使用する例です。PHP
は定数についても認識します。以下のような E_*
の使用例を見たことがあるかもしれません。
最初の例の bar と全く同様に
E_ERROR も有効な添字であることに注意してください。
しかし、実際には最後の例は次のように書くことと同じです。
これは、E_ERROR が 1
と等しいこと等によります。
では、なぜ $foo[bar] は動作することが可能なのでしょう?
それは、bar が定数式であることを
期待される構文で使用されているためです。しかし、この場合、
bar という名前の定数は存在しません。PHP は、
この場合、あなたが文字列"bar" のようにリテラル
bar を指定したが引用符を忘れたと仮定します。
では、なぜ間違っているのでしょう?
将来的に、PHP 開発チームが他の定数またはキーワードを追加したいと思うかもしれず、
問題となる可能性があります。例えば、現在でも、
単語 empty および
default を使用することはできません。
これは、これらが特別な
予約済みのキーワード であるためです。
注意 :
二重引用符で括られた 文字列 の中では
引用符で配列の添字を括らないことができ、このため、
"$foo[bar]" は有効です。
この理由の詳細については、上記の例や
文字列中での変数のパース を参照してください。
配列への変換
integer , float , string ,
boolean , resource のいずれの型においても、
array に変換する場合、
最初のスカラー値が割り当てられている一つの要素 (添字は 0)
を持つ配列を得ることになります。
object を配列にする場合には、配列の要素として
オブジェクトの属性 (メンバ変数) を持つ配列を得ることになります。
添字はメンバ変数名となりますが、いくつか注意すべき例外があります。
整数のプロパティはアクセス不能になります。
private 変数の場合、変数名の頭にクラス名がつきます。また、
protected 変数の場合は、変数名の頭に '*' がつきます。
このとき、頭に追加される値の前後に null バイトがついてきます。
その結果、予期せぬ振る舞いをすることがあります。
上の例では 'AA' というキーがふたつあるように見えますが、
そのうちひとつは、実際は '\0A\0A' ということになります。
NULL を配列に変換すると、空の配列を得ます。
例
PHP の配列型は、いろいろな使い方ができます。配列の強力な機能を示すため、
ここでいくつかの例を紹介します。
例1 array() の使用例
<?php // マップを行う配列 $map = array( 'version' => 4 , 'OS' => 'Linux' , 'lang' => 'english' , 'short_tags' => true ); // 数値キーのみを有する $array = array( 7 , 8 , 0 , 156 , - 10 ); // これは、array( 0 => 7, 1 => 8, ...) と同じです $switching = array( 10 , // key = 0 5 => 6 , 3 => 7 , 'a' => 4 , 11 , // key = 6 (最大の添字は5です) '8' => 2 , // key = 8 (整数!) '02' => 77 , // key = '02' 0 => 12 // 値10は12で上書きされます ); // 空の配列 $empty = array(); ?>
例2 コレクション
<?php $colors = array( 'red' , 'blue' , 'green' , 'yellow' ); foreach ( $colors as $color ) { echo "Do you like $color ?\n" ; } ?>
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
PHP 5 以降では、配列を参照渡しすることでその値を直接変更できるようになりました。
それ以前のバージョンでは、以下のような回避策が必要です。
例3 コレクション
<?php // PHP 5 foreach ( $colors as & $color ) { $color = strtoupper ( $color ); } unset( $color ); /* これ以降の $color への書き込みが 配列の要素を書き換えてしまわないことを保証する */ // 旧バージョンでの回避策 foreach ( $colors as $key => $color ) { $colors [ $key ] = strtoupper ( $color ); } print_r ( $colors ); ?>
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
この例は、1 から始まる配列を作成します。
例4 1 から始まる添字
<?php $firstquarter = array( 1 => 'January' , 'February' , 'March' ); print_r ( $firstquarter ); ?>
Array
(
[1] => 'January'
[2] => 'February'
[3] => 'March'
)
例5 配列に代入する
<?php // ディレクトリから全てのアイテムを配列に代入する $handle = opendir ( '.' ); while ( false !== ( $file = readdir ( $handle ))) { $files [] = $file ; } closedir ( $handle ); ?>
配列には順番が付けられます。異なったソート関数を用いて順番を変更することも可能です。
より詳細な情報については、配列関数 を参照ください。
count() 関数を使用することで、
配列の要素数を数えることが可能です。
例6 配列のソート
<?php sort ( $files ); print_r ( $files ); ?>
配列の値は何でも良いため、その値を他の配列とすることも可能です。
これにより、再帰的な配列や多次元の配列を作成することが可能です。
例7 再帰および多次元配列
<?php $fruits = array ( "fruits" => array ( "a" => "orange" , "b" => "banana" , "c" => "apple" ), "numbers" => array ( 1 , 2 , 3 , 4 , 5 , 6 ), "holes" => array ( "first" , 5 => "second" , "third" ) ); // 上の配列の内容を取得するための例 echo $fruits [ "holes" ][ 5 ]; // "second" を表示します echo $fruits [ "fruits" ][ "a" ]; // "orange" を表示します unset( $fruits [ "holes" ][ 0 ]); // "first" を削除します // 新しい多次元配列を作成します $juices [ "apple" ][ "green" ] = "good" ; ?>
配列への代入においては、常に値がコピーされることに注意してください。
配列をリファレンスでコピーする場合には、
リファレンス演算子を使う必要があります。