PHPなら覚えるべきデータ構造はひとつだけ? - 配列

PHPを使う場合に必ず必要になるデータ構造、配列の使い方の覚書きです。

PHPの配列は高機能

PHPの配列は、配列とマップの両方の役割を果たす高機能なデータ構造です。
まず、複数件のデータを扱ういわゆる配列として使用できます。
さらに、キーと関連付けてデータを格納する、マップとしても使用できます。

配列らしい使い方

■配列を生成する

配列の生成は以下のように行います。

$配列の名前 = array();
$配列の名前 = array( データ1, データ2, … );

配列の生成では、配列の名前を指定します。もし、生成時に配列にデータを格納する場合は、()中に格納するデータを指定します。
なお、PHPの配列の生成では、配列のサイズは指定しません。


例えば、空の配列array1を生成するには、以下のように書きます。

$array1 = array();

もう一つ例を挙げます。データを4つ格納した配列array2を生成するには、以下のように書きます。

$array2 = array( "APPLICATION", "SESSION", "REQUEST", "PAGE"  );
■配列にデータを追加する

配列へのデータを追加は以下のように行います。

$配列の名前[] = データ;
array_push( $配列の名前, データ1, データ2, … );

データの追加では、配列の名前とデータを指定します。1件のデータを追加する場合は『$配列の名前[] = 』の形式を、複数件のデータを追加する場合は『array_push()』を使うとよいです。
追加するたびに、データは配列の末尾に追加され、配列のサイズが増えていきます。


例えば、配列array1にデータを追加するには、以下のように書きます。

$array1[] = "test";
array_push( $array1, "hello", "world" );
■配列からデータを取得する

配列からのデータを取得は、以下のように行います。

関数( $配列の名前[添字] );
変数 = $配列の名前[添字];
return $配列の名前[添字];

配列からのデータの取得では、配列の名前とデータを取得する位置(添字)を指定します。添字とは配列中の位置を表す数字で、「0」以上「配列のサイズ」より小さいの数字を指定する必要があります。
配列から取得したデータは、変数に代入したり、関数の引数に渡したり、関数の戻り値として返したりできます。


たとえば、配列array1の内容を取得し、画面に表示するには以下のように書きます。

print $array1[0]."\n"; => test
print $array1[1]."\n"; => hello
print $array1[2]."\n"; => world
■配列中のすべてのデータに同じ処理をする

配列中のすべてのデータに同じ処理をするには、以下のようなfor文を使用します。

for ( $ i = 0; $i < count( $配列の名前 ); ++ $i ) {
        // $配列の名前[$i]を使用した処理
}

このfor文の『count( 配列の名前 )』は配列のサイズを表します。そのため、このfor文を使えば配列中のすべてのデータに同じ処理を行えます。


例えば、配列array2中のデータをすべて表示するには、以下のように書きます。

for ( $i = 0; $i < count( $array2 ); ++$i ) {
        echo $array2[$i]."\n";
}

配列array2のサイズを4だとすれば、これは以下のように書いた場合と同じ結果になります。

echo $array2[0]."\n"; => APPLICATION
echo $array2[1]."\n"; => SESSION
echo $array2[2]."\n"; => REQUEST
echo $array2[3]."\n"; => PAGE

マップみたいな使い方

■(マップみたいに)配列を生成する

配列の生成は以下のように行います。

$配列の名前 = array();
$配列の名前 = array( キー1 => データ1, キー2 => データ2, … );

配列の生成では、配列の名前を指定します。
もし、生成時にマップみたいにデータを格納する場合は、()内にキーとデータを指定します。配列に格納したデータは、キーに関連付けられます。


例えば、空の配列mapを生成するには、以下のように書きます。

$map1 = array();


もう一つ例を挙げます。キーを4つ格納した配列map2を生成するには、以下のように書きます。

$map2 = array( "Jan" => "1月", "Feb" => "2月", "Mar" => "3月", "Apr" => "4月" );
■(マップみたいに)配列にデータを格納する

配列へのデータの格納は以下のように行います。

$配列の名前[キー] = データ;

マップみたいなデータの格納では、配列の名前とキーとデータを指定します。配列に格納したデータは、キーに関連付けられます。


例えば、配列map1にデータを格納するには、以下のように書きます。

$map1["red"] = "apple";
$map1["yellow"] = "banana";
$map1["green"] = "watermelon";
■(マップみたいに)配列にデータを取得する

配列からのデータの取得は以下のように行います。

関数( $配列の名前[キー] );
変数 = $配列の名前[キー];
return $配列の名前[キー];

マップみたいなデータの取得では、配列の名前とキーを指定します。キーに関連付いたデータが、配列から取得されます。
配列から取得したデータは、変数に代入したり、関数の引数に渡したり、関数の戻り値として返したりできます。


たとえば、配列map1の内容を取得し、画面に表示するには以下のように書きます。

print $map1["yellow"]."\n"; => banana
print $map1["red"]."\n"; => apple
print $map1["green"]."\n"; => watermelon
■(マップみたいに)配列中のすべてのデータに同じ処理をする

配列中のすべてのデータに同じ処理をするには、以下のようなforeach文を使用します。

foreach ( $配列の名前 as $key => $data ) {
        // $keyや$dataを使用した処理
}

このforeach文では、全てのキーとデータについて処理が繰り返されます。繰り返す毎に、変数$keyにはキーが、変数$dataにはデータが格納されます。


例えば、配列map2中のすべてのキーとデータの関連付けを表示するには、以下のように書きます。

foreach( $map2 as $key => $data ) {
        echo "$key: $data\n";
}

これは、以下のように書いた場合と同じような結果になります。ただし、キーの順序は決まっていないので、表示順序が異なることがあります。

print "Jan: ".$map2["Jan"]."\n"; => 1月
print "Feb: ".$map2["Feb"]."\n"; => 2月
print "Mar: ".$map2["Mar"]."\n"; => 3月
print "Apr: ".$map2["Apr"]."\n"; => 4月