初心者による初心者のためのPHP講座 第7回 配列

初心者による初心者のためのPHP講座 第7回 配列「配列」は変数の一種であるが、通常の変数が、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のコードで考えるよりも構造を図示をした方理解しやすいかもしれない。

これまで例では、名前と年齢を紐付けた連想配列を作成したが、ここでは、加えて性別も格納するとする。

以下で、その構造を図示してみた。

  • suzuki
    • age:13
    • sex:male
  • yamada
    • age:25
    • sex:female
  • tanaka
    • age:46
    • sex:male

黒四角が各要素の「キー」であり、黒丸が値になるが、値は複数あるので、それぞれの黒丸のペアも独立した配列になる。

つまり、連想配列の中で、名前に紐付けられた形で年齢と性別の連想配列を格納する。

ちなみに、これは二次元配列である。

以下、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);
?>

以上は一例であり、配列を処理できる関数は数多く存在する。



PHP, PHP講座, ネット・PCPermalink