PHP

PHPの配列について

More than 1 year has passed since last update.

はじめに

自分自身は一昨年までの10年近くにわたって主にC言語やC++を使って数値計算や画像処理などの仕事をしていて、そこからWeb分野に移るために去年からPHPを勉強し始めたのですが、PHPを勉強して最初に新鮮に感じたのが配列の扱いに関しての自由さでした。
そこで、今回はPHPの配列で特に知っていることを主に初心者向けに簡単にまとめてみました(自分が以前ブログに書いた内容とほぼ変わらないですが)。

初期化

空の配列を初期化する時は

$data = array();

とします。PHPに慣れていると当たり前に思えるかもしれませんが、C言語では

int data[10];

という風に最初にデータ型とサイズを指定しなければいけませんでした。サイズを可変にする時はポインタを使って宣言して、後でmallocで必要な領域分だけ確保することもできますが、後でfreeしなければいけなかったり、色々と扱いに苦労する点も多々ありましたが、PHPではその必要もありません(C++のvectorなら最後に領域を解放しなくても大丈夫ですが)。

値を入れて初期化する時は

$data = array(2, 3, 5);

のようにします。
なお、PHP5.4からは

$data = [];
$data = [2, 3, 5];

のようなやり方での初期化もできるようになっています。

要素の追加

$data[3] = 7;

のような普通のやり方ももちろんできますが、現時点での要素数が分からなくても

$data[] = 7;

みたいに簡単に要素を追加することもできます。
C++のvectorでは

data.push(7);

のようにしていましたが、PHPでもarray_pushという関数を使って

array_push($data, 7);

みたいにもできます。自分は楽なので普段は[]=を使っていますが。

要素の削除

こちらはarray_spliceという関数を使います。

$data = [2, 3, 5, 7];
array_splice($data, 1, 2);

とすると$data[1]から2つ要素が削除されます。
上の処理を行った結果は

echo $data[0]; //2
echo $data[1]; //7

となります。

配列の要素を削除する関数は他にもunsetというのがあります。例えば$data[1]を配列$dataから取り除きたい時は

$data = [2, 3, 5, 7];
unset($data[1]);

とします。ただしこちらはインデックスには作用しないので結果は

echo $data[0]; //2
echo $data[2]; //5
echo $data[3]; //7

です。$data[1]にアクセスするとエラーになります。
インデックスをちゃんとした並び順にする時はunsetの後に

array_values($data);

とする必要があります。

連想配列

PHPでは配列の要素に整数以外を入れることもできます。つまり、連想配列とほぼ変わらない使い方ができます。
例えば、こんな感じです。

$data['Tokyo']     = 'Japan';
$data['Vientiane'] = 'Laos';
$data['Manila']    = 'Philippines';

のようなこともできます。
他にも配列の値を配列にして多次元配列みたいにすることもできます。

配列用関数

これまででいくつか出てきていますが、PHPには配列操作のために用意された便利な関数がたくさんあります。
例えば、

$data = [2, 3, 5, 7];
echo count($data);  //4

というように配列の要素数を返す関数が代表例です。
また、ある要素が配列に含まれているか調べるin_arrayという関数もあります。

$data = [2, 3, 5, 7];
echo in_array(3, $data);  //true
echo in_array(4, $data);  //false

他にもたくさんあるので、どんなものがあるのか知りたい方はPHP公式サイトのページを見ていただければと思います。

まとめ

ここまで書いていて、C言語やC++しか知らなかった頃の自分からすると「PHPの配列ってvectorとmapのいいとこ取りですごいなー」と思うかもしれない。とはいえ、便利さの裏にはちゃんと何をやっているか意識して使わないと訳わからないことになっちゃったりする恐れもあるので、そこは気をつけておくべきなんだとは思いますが。
逆に言うと、CやC++の型定義の厳密さやポインタにもそれはそれでメリットがあるのもまた確かではありますね。
どんな言語でも配列というものはデータを扱うのに用いる一番基本的な道具だと思うので、その言語の特性を生かした使い方をするのが大事なんだろうなと思います。