「配列」は変数の一種であるが、通常の変数が、1つの変数に1つの値しか格納できないのに対して、「配列」とは、複数の値を格納する変数のことである。
配列は、格納する値同士の紐付けが容易であるため、重宝する場面が多く、出番も多いので必ずマスターしておく必要がある。
私の場合、それほど多用するわけではないが、設定パラメーターを格納する際には、よく配列を用いている。
配列の定義
例えば、年齢を変数に格納するとしよう。
複数の年齢を格納する場合は、今まで学んだ知識の範囲でこれを記述するとなると、
<?php
$age1 = 13;
$age2 = 25;
$age3 = 46;
?>
のように複数の変数を定義する必要がある。
値の数が少ない場合は、上記のような定義も悪くはないが、値の数が1,000個、10,000個となると、定義すべき変数の数が膨大になり、非常に効率が悪い。
しかし、配列を用いれば、複数の値を1つの変数に格納することが出来る。
実際に配列を使って定義すると以下のようになる。
<?php
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;
?>
上記の例では、1つの変数と言うことも出来る配列$ageに全ての構成要素が格納されている。
配列と言っても通常の変数と書式に違いはないが、配列に格納される各要素(値)を定義する場合は、角括弧構文を用いて[キー]を指定する必要がある。
<?php
$変数名[キー1] = 値1;
$変数名[キー2] = 値2;
$変数名[キー3] = 値3;
?>
「キー」と「値」は、必ずペアになっており、「キー」に紐付けられた「値」を配列の要素と呼ぶ。
「要素」は「値」が住んでいる部屋で、そのルームナンバーが「キー」と理解すると良いだろう。
配列から値を取り出したい場合も、ルームナンバーである「キー」を使って取り出すことが出来る。
値としては、通常の変数同様に、整数値、浮動小数点、文字列、論理値、NULLが格納できる他、配列を格納することも出来る。
配列を格納する配列を、多次元配列と呼ぶが、これについては後ほど説明する。
以下の例では、配列$ageを定義し、$ageからキー「1」の値を取り出してecho()で表示させている。
<?php
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;
echo $age[1];
?>
以上のように、特定の値を取り出す場合にも角括弧構文を用いて、キーで指定する。
キーに0から始まる整数値を使う場合は、下記のように角括弧構文の中のキーを省略して定義することも出来る。
<?php
$age[] = 13;
$age[] = 25;
$age[] = 46;
echo $age[1];
?>
上記の例では、キーは省略されているもの、各要素には先頭から順に0、1、2・・・と言った整数値がキーとして与えられており、「25」と表示される。
また、配列は角括弧構文以外でも定義でき、配列の定義のために用意されているarray()関数を使って配列を定義することも出来る。
<?php
$age = array(13, 25, 46);
?>
キーは、省略されているが、この場合も、各要素には0から始まる整数値のキーが自動的に割り当てられる。
明示的にキーを書くならば、下記のようになる。
<?php
$age = array(0 => 13, 1 => 25, 2 => 46);
?>
array()関数を用いる場合は、演算子「=>」を使って、キーと値の関係を記述し、要素を定義できる。
また、explode()関数を使えば、特定の文字で区切られた文字列を配列に格納することが出来る。
<?php
$str_age = "13,25,46";
$age = explode(",", $str_age);
echo $age[1];
?>
上記の例では、「,」を区切り文字として「,」で元の文字列を分解し、先頭から順に要素として格納している。結果、「25」と表示される。
その他、str_split()関数、preg_split()関数など、戻り値として配列を返す関数は、数多く有り、これらも配列の定義に利用することが出来る。
空の配列
array()関数を使って配列を定義し、下記のように引数を省略すれば、要素を持たない空の配列を定義することが出来る。
<?php
$var = array();
if ($var === NULL) {
echo "NULLです。";
} else if (is_array($var)) {
echo "配列です。";
}
?>
ただし、型としては配列であるため、型の違いまで考慮すれば、NULLとは本質的に異なる。
なお、is_array()関数は、変数が配列の場合はtrue、そうでない場合は、falseを返す。
予め空の配列を定義する行為に意味がないわけではなく、配列が要素を持たない場合にも、空の変数ではなく、空の配列として識別が可能であるため、例えば、条件分岐によって要素を与え、条件によっては、全く要素が追加されず、空になるケースが考えられる場合でも、型としては配列であり、それを判定することが出来る。
特に角括弧構文を用いて要素を定義し、配列を組み立てる場合は、1つ目の要素が定義されるまでは、仮に参照したとしても未定義の変数でしかないので、予め、空の配列として定義しておくと良い。
<?php
$age = array();
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;
echo $age[1];
?>
些細な事ではあるが、空の変数と区別する場合は重要である。
配列全体を表示する
配列全体を表示させる処理を実際のプログラムの中で使うことは、少ないかもしれないが、デバッグ用に出力して配列の中身を確認する必要性が生じるケースは少なくないので、これも覚えておく必要がある。
しかし、下記の例は上手くいかない。
<?php
$age = array(13, 25, 46);
echo $age;
?>
それは単純にecho()関数が、キーを指定せずに配列全体を表示させることは出来ず、結果は「Array」と表示してしまうからである。
代わりにprint_r()関数、var_dump()関数、var_export()関数を使うと良い。
<?php
$age = array(13, 25, 46);
print_r($age);
?>
連想配列
「連想配列」と言っても特殊な配列ではなく、整数値ではなく、文字列をキーに持つ要素を格納する配列のことである。
<?php
$age['suzuki'] = 13;
$age['yamada'] = 25;
$age['tanaka'] = 46;
?>
や
<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);
?>
が「連想配列」になる。
「キー」には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。
このようにキーに文字列を使い意味を持たせることで、配列の意図がより分かりやすいものになる。
連想配列の場合も、角括弧構文を用いて、キーを指定して配列から値を取り出すことができる。
<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);
echo $age['yamada'];
?>
多次元配列
多次元配列とは、値として配列を格納する多重構造の配列である。
値として配列を格納することで、より複雑なツリー構造を構築でき、構造自体は複雑になるかもしれないが、配列の持つ意味は、明示的なものであり、PHPのコードで考えるよりも構造を図示をした方理解しやすいかもしれない。
これまで例では、名前と年齢を紐付けた連想配列を作成したが、ここでは、加えて性別も格納するとする。
以下で、その構造を図示してみた。
黒四角が各要素の「キー」であり、黒丸が値になるが、値は複数あるので、それぞれの黒丸のペアも独立した配列になる。
つまり、連想配列の中で、名前に紐付けられた形で年齢と性別の連想配列を格納する。
ちなみに、これは二次元配列である。
以下、3つの方法で連想配列を定義してみた。
<?php
// array()関数を使わずに定義
$prof['suzuki']['age'] = 13;
$prof['suzuki']['sex'] = 'male';
$prof['yamada']['age'] = 25;
$prof['yamada']['sex'] = 'female';
$prof['tanaka']['age'] = 46;
$prof['tanaka']['sex'] = 'male';
echo $prof['yamada']['sex'];
?>
<?php
// 内包する配列のみarray()関数を使って定義
$prof['suzuki'] = array('age' => 13, 'sex' => 'male');
$prof['yamada'] = array('age' => 25, 'sex' => 'female');
$prof['tanaka'] = array('age' => 46, 'sex' => 'male');
echo $prof['yamada']['sex'];
?>
<?php
// 全てにarray()関数を使って定義
$prof = array(
'suzuki' => array('age' => 13, 'sex' => 'male'),
'yamada'=> array('age' => 25, 'sex' => 'female'),
'tanaka' => array('age' => 46, 'sex' => 'male'),
);
echo $prof['yamada']['sex'];
?>
おそらく3番目の方法が一番分かりやすいだろう。
末端の値を取り出す場合も、一次元の配列同様に角括弧構文を用いて「キー」で指定する。
ただし、複数のキーを記述する必要がある。
以下のように書いても良いし、以下の例のほうが、その意味が分かりやすいかもしれない。
<?php
$val = $prof['yamada'];
echo $val['sex'];
?>
キーの自動付与
キーを省略した場合は、自動的に0から始まる整数値がキーとして与えられることは前にも書いたが、ここでは少し複雑な例を扱う。
下記の例では、最後の要素に与えられるキーはどのようになるだろうか?
<?php
$color[3] = 'black';
$color[11] = 'white';
$color[] = 'blue';
?>
答えは、「12」である。
上の例では、キーの最大値が11であるため、その続きとして12となる。
これは、次のようにarray()関数を用いた場合も同様である。
<?php
$color = array(3 => 'black', 11 => 'white', 'blue');
?>
配列の操作
ここでは、様々な配列の操作について学ぶ。PHPでは、配列を扱う関数が充実しており、配列に対して様々な処理を簡単に行うことが出来る。
ここでは、一部ではあるが、それらを紹介する。
次の例では、キーとして「2」が与えられている要素が2度定義されている。
<?php
$color[0] = 'black';
$color[1] = 'white';
$color[2] = 'blue';
$color[2] = 'red';
echo $color[2];
?>
上記の例では、最終的に「red」と表示される。
つまり、要素を定義し直すことで、配列の要素を上書き出来るのである。
また、要素を削除するにはunset()関数を使えば良い。
<?php
$color[0] = 'black';
$color[1] = 'white';
$color[2] = 'blue';
unset($color[2]);
print_r($color);
?>
list()関数を使えば、配列を分解し、指定した変数に代入し直すことが出来る。
<?php
$color = array('black', 'white', 'blue');
list($val1, $val2, $val3) = $color;
echo $val2;
?>
extract()関数は、キーを変数名とした変数に値を格納し、配列を個別の変数に分解してくれる。
<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);
extract($age);
echo $yamada;
?>
配列に格納される要素の数を知りたいなら、count()関数を使うと良い。
<?php
$color = array('black', 'white', 'blue');
echo count($color);
?>
implode()は、指定した文字列で要素の値を結合した文字列を返す。以下の例では「,」で結合されて「black,white,blue」となる。
<?php
$color = array('black', 'white', 'blue');
$color_list = implode(",", $color);
echo $color_list;
?>
配列を値でソートする場合は、昇順ならsort()関数、降順ならrsort()関数を使えば良い。ただし、キーと値との関係は維持されない。
<?php
$color = array('black', 'white', 'blue');
sort($color);
print_r($color);
?>
また、連想配列を値でソートする場合は、昇順ならasort()関数、降順ならarsort()関数を使う。キーと値の関係は維持される。
<?php
$name = array('suzuki' => 'taro', 'yamada'=> 'ichiro', 'tanaka' => 'ai');
asort($name);
print_r($name);
?>
連想配列をキーでソートするならksort()関数、krsort()関数を使う。この場合も、キーと値の関係は維持される。
<?php
$name = array('suzuki' => 'taro', 'yamada'=> 'ichiro', 'tanaka' => 'ai');
ksort($name);
print_r($name);
?>
複数の配列をマージ(結合)するなら、array_merge()関数を使えば良い。
<?php
$name1 = array('suzuki', 'yamada', 'tanaka');
$name2 = array('yamamoto', 'takahashi', 'honda');
$new_array = array_merge($name1, $name2);
print_r($new_array);
?>
以上は一例であり、配列を処理できる関数は数多く存在する。