Perl入門 ≫ LESSON5 配列

配列って?

配列とはなんぞや?
難しく考えることはありません。
リストと言えばわかりやすいでしょうか?つまり、データのまとまりです。
データをまとめて、順番に持ちたい場合に使います。

例えば、5人の名前をプログラム中で変数として扱う場合、

$name1 = "takeda";
$name2 = "uesugi";
$name3 = "houjou";
$name4 = "oda";
$name5 = "date";

これでもいいんです。別に。ただし、やっぱり同じ内容のデータだったら、まとめて保持できないものか?
と考えると、この名前一覧を“名前”という配列に入れてあげればスマートです。

名前配列 = array("takeda","uesugi","houjou","oda","date")

こんな風に。
すると、名前配列の何番目のデータは・・・ってな具合で利用できるのです。


では、他のデータで実際にやってみましょう。
配列名の前には$をつけて表現します。

$hensu = array('data1','data2','data3');

または

$hensu = ['data1','data2','data3'];

この場合、配列$hensuには3つのデータ(要素)が入っています。
配列の各データは各自”,”で区切り、“(”と“)”の間に左から順に書きます。
最初にarrayとつけましょう。配列の意味になります。
それか、リストの前後を“[”と“]”で囲っても同じです。
個人的にはarray()のほうを良く使います。

配列$hensuの一番目のデータは文字列'data1'、二番目のデータは文字列'data2'、三番目のデータは文字列'data3'です。

定義するのはわかったけど、その値を見る時はどうするかというと、それぞれ$hensu[0],$hensu[1],$hensu[2]で取り出すことができます。

配列名と同じ名前の前に$を付けます。
[ ]の中の数字の部分は、添え字と言い、必ず0から始まります。

それぞれの場所の値を変更する場合、$hensu[1]に値を代入すれば良いのです。
現在の最大添え字よりも大きい場所に値を追加すると、配列はそこまで拡大されます。
ちょっとやってみましょう。

$hensu = array('data1','data2','data3');

echo "1th data = $hensu[0]\n";
echo "2th data = $hensu[1]\n";
echo "3th data = $hensu[2]\n\n";
#それぞれのデータを取り出します。

$hensu[2] = 'data2_1';
echo "2th data = $hensu[2]\n\n";
#2番目のデータを変更します。

$hensu[3] = 'data4';
echo "4th data = $hensu[3]\n";
#4番目にデータを追加します。

結果は以下。

1th data = data1
2th data = data2
3th data = data3

2th data = data2_1

4th data = data4

配列の中のデータは文字列だけではありません。
数字や数字と文字の混ざったものも入れることができます。

$hensu = array(10,35,60,77);
$hensu = array(2, "aaa",5);


扱い方は文字列と同様です。

リストの数

$hensu = array(10,35,60,77);

の配列の要素の数は4つです。
では、要素が0のリストは

$hensu = array();

または

$hensu = [];

と書きます。

配列を使う場合、最初に定義するものが何もなければとりあえずこの

$hensu = array();

とやって初期化しておきましょう。

では、初期化してその後は配列の最初の要素から順に値を入れていかなければならないかというと、そんなことはありません。
初期化さえしてしまえば、配列が許す範囲内で自由にどの要素にもアクセスできます。
では、その間とそれより大きい添え字部分の要素の中身はどうなっているかというと、何にも入っていません。

$hensu = array();

$hensu[2] = "test";
echo "1th data = $hensu[0]\n";
echo "2th data = $hensu[1]\n";
echo "3th data = $hensu[2]\n";
echo "10th data = $hensu[9]\n";
#それぞれのデータを取り出します。

結果は以下。

1th data =
2th data =
3th data = test
10th data =


実際は警告が入りますが、3番目のデータ以外何も入っていないことがわかります。
ですが、実際はやはりちゃんと最初からデータを定義していって、何もなければ0なり""(長さ0の文字列)なり定義しておくことを勧めます。


要素の値

配列の各要素の値は、数値・文字・文字列が使えます。
が、他にも変数を使うことができます。

変数を使う場合は以下のようになります。

$hensu = array($d1,'data2','data3');
$hensu = array($d1,"data2 ${d1}",'data3');

実際にやってみましょう。

$d1 = 'aa';
$hensu = array($d1,"data2 ${d1}",'data3');
var_dump($hensu);

結果は以下。

array(3) {
  [0]=>
  string(2) "aa"
  [1]=>
  string(8) "data2 aa"
  [2]=>
  string(5) "data3"
}

今まで出力にechoを使ってきました。これは単純に1つ値を表示できます。
配列は値がまとまったものなので、配列全体をechoで表示することはできません。
が!
var_dump を使うと↑のようにデータ全部を添え字とともに表示してくれます。
ちなみにvar_dumoで1つの値を出すこともできます。
↑のプログラムで

var_dump($d1);

とやると、

string(2) "aa"

と表示されます。var_dumpは、そのデータの種類が何であるかも含めてデータの詳細も表示してくれます。(2)の2は文字の長さです。

配列に値を追加する

配列に値を追加するには、添え字を指定して追加するほか、添え字なしで単に[]とだけすると、配列の最後に追加されます。

$hensu = array();

$hensu[] = 10;
$hensu[] = 20;
echo $hensu[1];

結果は以下。

20

$hensuの中は、$hensu[0]に10、$hensu[1]に20が入った状態です。



多次元配列

配列の中に配列を定義してみましょう。

$hensu = array(3, array(1, 2));
var_dump($hensu);

出力してみます。

array(2) {
  [0]=>
  int(3)
  [1]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(2)
  }
}

こうなります。

図にするとこういうことです。

$hensu[1]には配列が入っています。このように、配列の中に配列、とか次に説明するハッシュとかが入っているもの多次元配列と呼びます。
多次元配列の中の各値は、$hensu[1][0]や$hensu[1][1]と書きます。[]が複数ありますが、前から順に一番外側の配列の添え字となります。

もっとわかりやすい形にしてみましょう。

$hensu = array(
    array('a', 'b', 'c'),
    array('d', 'e', 'f'),
    array('g', 'h', 'i')
  );

こういうことですね。

echo $hensu[2][1];

とすると、「h」が出力されます。
もちろん追加、値変更も同じように添え字を複数指定すればできます。

$hensu[2][] = 'j';

こうすれば、$hensu[2]の中身は追加されてarray('g', 'h', 'i', 'j')となります。
すべての要素は全部同じ個数である必要はないので、自由な形のデータを作る事ができます。。



配列のリファレンス

配列へのリファレンスを作ってみます。

$hensu = array(10,20,30,40,50);
$hensu1 = &$hensu;

echo $hensu1[0];

結果は以下。

10

おなじものを指す別名、と思えばわかりやすいです。

$hensu1[0] = 60;

と値を変更したら、$hensu1[0]も$hensu[0]も同じ60が入っていることになります。



ページのトップへ戻る