配列

配列って何なんですか?

配列はね、基本的に変数なんだよ

配列」は基本的に変数なので、配列の名前は変数名を付ける様に付けます。

配列は好きなだけ値を格納出来るのです

通常の変数は、1つの値しか格納する事が出来ませんでした。変数のイメージは「文字列から数値やらなんやら何でもかんでも、その大きさにフィットするサイズになって1つだけ入れる事が出来る魔法の箱」でした。で、PHPの「配列」のイメージは、「この「魔法の箱」を抱えた「手」が無数に生えた千手観音様」です。

どういうことか?要するに、配列には無数の値を格納出来るという事です。では、配列を定義する方法を示したサンプルと結果を以下に。

<html>
<body>
<?php
    $animals = array(1 => "dog", 2 => "cat", 3 => "cow");
    
    echo $animals."<hr />";
    
    echo $animals[1]."<hr />";
    echo $animals[2]."<hr />";
    echo $animals[3]."<hr />";
    
    echo count($animals)."<hr />";
    
    
    $animals = "eiko";
    
    echo $animals."<hr />";
    
    echo count($animals);
?>
</body>
</html>
Array

dog
cat
cow
3
eiko
1

まず、サンプルコードの中の「array(1 => "dog", 2 => "cat", 3 => "cow")」の部分で、配列を生成し、「変数$animals」に代入しています。

array()」は、「配列を生成する」関数の格好をしたPHPの言語構造です。

array(1 => "dog", 2 => "cat", 3 => "cow")」内の「1 => "dog", 2 => "cat", 3 => "cow"」の部分は、配列のイメージのまま説明すると、「1番目の手の箱に文字列の「"dog"」を、2番目の手の箱に文字列の「"cat"」を、3番目の手の箱に文字列の「"cow"」をそれぞれ格納する」という意味になります。

そして「変数$animals」は、配列を代入された瞬間、配列に姿を変えます。

次に、この「変数$animals」の値を出力しようとしています。結果出力されたのは「Array」というものです。これは、「変数$animals」が配列である事を表しています。

その次に、また変わった記述があります。「$animals[1]」の部分です。これを出力すると、「dog」が出力されました。これは、「1番目の手の箱に格納した文字列の「"dog"」」です。「変数(配列)$animals」の後ろに「[n](「n」は「手」の番号)」を置くと、配列の「n」番目の値を参照する事が出来るのです。

更にその次にまた変なのが登場しました。「count($animals)」の部分です。これは、「変数の「要素」の数を返す」という処理をする関数です。「要素」は、各々の箱に入ったそれぞれの値の事です。今回のサンプルでは、3つの値を格納したので「3」が出力されています。

更にその次には「$animals = "eiko";」と、配列に文字列を代入しようとしています。どうなるんでしょうか。結果を見ると、「変数(配列)$animals」はもはや配列ではなくなっています。「count($animals)」の結果の「1」を見ても、「変数が格納出来る値は1つ」という性質を持つ変数に戻ったと判ります。

実際のところ配列は・・・

「配列は基本的に変数」なんて事を書きましたが、実際はウソです(爆)。配列が変数なのではなく、配列は変数の値(配列型の値)というのが事実です(「型」のページにもあるように)。

「配列型の値」って一体どういう値なのか・・・?その正体は、「マップ」と呼ばれるものです。マップとは、「対応させられたもの」という意味で、じゃぁその「対応させられたもの」って何なのか?それは「手」です。実は「"dog"」等の値は別な所にあり、「どの「手」にどの「値」を」という感じで対応させている(「手」で掴んでいるイメージ)のです。

添え字(インデックス、キー)と要素

この、配列の「手」に当たるものを「添え字(インデックス、キー)」と言い、「値」の事を「要素」と言います。前回のサンプルだと「1 => "dog", 2 => "cat", 3 => "cow"」の部分の左側の数字が「添え字」で右側の文字列が「要素」です。

添え字の省略

配列の生成には、添え字を省略する書き方もあります。以下にサンプルと結果を。

<html>
<body>
<?php
    $animals = array("dog", "cat", "cow");
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
?>
</body>
</html>
0 : dog

1 : cat
2 : cow

「制御構造」のページで解説した反復構造の「foreach文」を使用しました。結果を見ると、「foreach($animals as $key => $val){ 処理 }」部の「$key」の値が、「0」から始まる連番になっています。

このように、配列の生成時に添え字を省略すると、自動的に「0」から始まる連番が割り振られます。しかし、これは全ての添え字を省略した場合の話で、添え字の一部を省略した形だと自体がちょっと変わってきます。以下にサンプルと結果を。

<html>
<body>
<?php
    $animals = array("dog", 3 => "cat", "cow");
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
    
    echo count($animals);
?>
</body>
</html>
0 : dog

3 : cat
4 : cow
3

配列の生成で、2つ目の要素にのみ添え字(「3」)を設定しました。その結果、3番目の添え字は「4」になっています。添え字の一部を省略した場合、省略した要素の添え字は、その前の要素の添え字に「+1」した値になります。念の為要素数を見ると、「3」になっています。添え字の数字は要素の背番号に過ぎないという事が判ります。更にもう1サンプルとその結果を以下に。

<html>
<body>
<?php
    $animals = array(-6 => "dog", "cat", "cow");
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
?>
</body>
</html>
-6 : dog

0 : cat
1 : cow

結果から、添え字に負の数を指定すると、次の添え字は「0」になるのが判ります。

連想配列

添え字に指定できるのは整数だけではありません。文字列を添え字とする事も可能です。この、添え字に文字列を使った配列を、「連想配列」と言います。以下にそのサンプルと結果を。

<html>
<body>
<?php
    $animals = array( "dog" => "wan", "cat" => "nyan",
                                    "cow" => "mou", "nda" );
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
?>
</body>
</html>
dog : wan

cat : nyan
cow : mou
0 : nda

「こんなんなりましたけど?」 最後だけ添え字を省略したら、「0」がセットされました。

要素の追加と削除、更新

変数は値の再定義が出来ましたが、配列でも、要素の一部を削除したり更新したり、追加したり出来ます。以下にサンプルと結果を。

<html>
<body>
<?php
    $animals = array("dog", "cat", "cow");
    
    $animals[0] = "pig";
    
    unset($animals[1]);
    
    $animals["X"] = "mino";
    
    $animals[] = "frog";
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
    
    echo count($animals)."<hr />";
    
    unset($animals);
    
    echo count($animals);
?>
</body>
</html>
0 : pig

2 : cow
X : mino
3 : frog
4
0

サンプルコードの中の「$animals[0] = "pig";」の部分で更新、「unset($animals[1]);」の部分で要素削除、「$animals["X"] = "mino";」の部分と「$animals[] = "frog";」の部分で要素の追加を行っています。

unset();」は、「指定した変数(複数指定可)を破棄する」という処理をする関数です。

$animals[] = "frog";」は、「変数$animals」に添え字指定なしで要素を追加します。添え字は、既にある添え字の最大値に「+1」したものがセットされます。

「array()」を使わない配列の生成

配列の生成には基本的に「array()」を使いますが、これを使わなくても生成する事が出来ます。以下にサンプルと結果を。

<html>
<body>
<?php
    $animals[]  = "dog";
    $animals[3] = "cat";
    $animals[]  = "cow";
    
    foreach($animals as $key => $val){
        echo $key." : ".$val."<hr />";
    }
?>
</body>
</html>
0 : dog

3 : cat
4 : cow

$animals[] = "dog";」のように、「変数$animals」に配列の要素を代入すると、その時点で配列が生成されます。

多次元配列

配列の要素には何でも格納する事が出来ます。勿論、配列も格納する事ができます。以下にサンプルと結果を。

<html>
<body>
<?php
    $animals[] = array("dog_A", "dog_B", "dog_C");
    $animals[] = "cat";
    $animals[] = array("cow_A", "cow_B", "cow_C");
    
    echo $animals[0][1]."<hr />";
    echo $animals[1]."<hr />";
    echo $animals[2][2];
?>
</body>
</html>
dog_B

cat
cow_C

要素が配列の場合、さらにその要素を参照するには、「$animals[0]」を変数と見立てて、「$animals[0][1]」のように書くと参照出来ます。

このような、配列の要素に更に配列が格納されている配列を、「多次元配列」と言います。

配列は複合型

最後になってしまいましたが、配列型と「クラス」のページで解説するオブジェクト型は「複合型」と呼ばれる方に分類されます。文字列型や整数型(「複合型」に対して「スカラー型」と言う)のリテラルが単純な1つの値であるのに対して、複数の値を持っているからです。

おさらいと予告

以上で、配列の解説は終わりです。

配列とは

  • 「配列」のイメージは、「「魔法の箱(変数)」を抱えた「手」が無数に生えた千手観音様」。
  • 配列の生成には基本的に「array()」を使い、「array(1 => "dog", 2 => "cat", 3 => "cow")」のような形で行う。
  • 配列の「手」に当たるものを「添え字(インデックス)」と言い、「値」の事を「要素」と言う。
  • 添え字(インデックス)は省略省略出来、省略すると自動でセットされる(既存の添え字の最大値+1)。
  • 添え字には文字列も指定できる(連想配列)。
  • 配列の生成には「array()」を使わない方法もある。
  • 要素に更に配列を入れることが出来る(多次元配列)。

演算子

次回は、加算などの計算や文字列連結等を行う「演算子」を解説します。

作成日:2004年05月16日 最終更新日:2004年05月18日
【印刷モード風モード で表示】