変数と配列

定数と変数

定数を定義する

定数を定義するためには、define()関数を使い、定数名とその値を引数とします。

    <?php
        define( "name", "山田 花子" );
        echo name;
    ?>
    

実行結果

山田 花子

前述のスクリプトは、定数nameに文字列「山田 花子を」代入し、echoによって文字列を表示しています。

変数を定義する

変数名にする文字列の先頭に「$」をつけると変数として使用することができます。
変数名に使用できる文字は以下の通りです。

  • アルファベット・数字・_(アンダーバー)・0x7F~0xFFまでのコードを持つ文字
  • 大文字・小文字を区別する。
  • 先頭に数字は使用できない。

0x7F~0xFFに関しては、文字コードの深い話になってくるので、ここでの説明は省きます。ひらがな・カタカナ・漢字など、日本語の変数名でも可能ということで理解していただいても構いません。ただし、_(アンダーバー)以外の記号は使用できません。

変数名は、大文字と小文字を区別するので、例えば「$name」・「$Name」・「$NAME」は、すべて違う変数として扱われます。

変数名の先頭に数字は使用できません。$123や$1nameなどという変数はすべて無効となります。$name1など、変数名の先頭を文字か_(アンダーバー)にすると数字が使用できます。

文字列と変数の違い

name(通常の文字列) $name(変数) $name       //使用可
$name1      //使用可
$2name      //使用不可
$_name      //使用可
$_3name     //使用可
$name-name  //使用不可
$名前       //使用可

変数に値を代入する

変数に値を代入する場合は=(イコール)を使用します。これは数学の世界の「等しい」という意味ではありません。PHPではこの=(イコール)を、「左辺の変数に、右辺の値を代入する」という意味で使用します。

変数に対し、数値はそのまま代入できます。文字列に関しては「"(ダブルクォーテーション)」で囲みます。

同じ変数に数値と文字列を代入することができる。

$number = 123456789; $number = "あいうえお";

変数に保持されている値を取り出す

変数に保持されている値を取り出す時は、スクリプトの中で変数名を指定します。この場合、変数は保持されている文字列や数値に変わります。

    <?php
        $number = 123456789;
        echo $number;
    ?>
    

実行結果

123456789

前述のスクリプトでは、変数$numberに「123456789」の数値を代入し、echoを使用して変数に保持されている値を表示しています。

変数の型

型とは、変数がそれぞれ整数であるのか文字列であるのかなどを表します。

例えば、「1」「12」「100」などは整数型、「1.14」「12.83」などの少数点がつくものは浮動小数点型、「あいうえお」や「abc」などは文字列型といった、扱う値の形式・性質を表す概念です。

PHPでは、8種類の基本型をサポートしています。

・ スカラー型

  • 論理値(boolean)
  • 整数(integer)
  • 浮動小数点数(float、double)
  • 文字列(string)

・ 複合型

  • 配列(array)
  • オブジェクト(object)

・ 特別型

  • リソース(resource)
  • ヌル(NULL)

PHPでは、変数の型は自動認識されるので、わざわざ型の宣言をする必要はありません。

スカラー型

スカラー型

スカラー型とは、常に一つの値を保持している変数のことです。例えば、名前のついた一つの箱のようなもので、その箱には数値・文字列を問わず、値を一つだけ入れることができます。

スカラー型

空白 型名 説明
boolean 論理型 「true」もしくは「false」のいずれか
大文字・小文字は区別しない
integer(double) 整数型 「1」 「12」 「100」などの小数点をもたない整数
float 浮動少数点型 「1.14」 「12.83」などの少数点以下の数値がある数値
string 文字列型 「あいうえお」「abcde」「文字」などの文字列

論理値(boolean)

論理値は真偽の型、trueかfalseのいずれかを表しています。変数に代入する時には、大文字・小文字に関係なくtrueまたはfalseを指定します。

論理値

$str = true; // 値trueを$strに代入する

既存の値を論理値へ変換する場合には、下記の値はfalseとみなされます。

  • intergerの0
  • floatの0.0
  • 空の文字列および文字列の0
  • ゼロを要素とする配列
  • ゼロを要素とするオブジェクト
  • NULL(値が入っていない変数を含む)

整数(integer)

PHPの整数が扱える範囲は-2,147,483,648~2,147,483,647で少数の値や指標を含まない値となります。整数の範囲外の数を指定した場合は、浮動小数点数として解釈されます。

また、計算結果が整数の範囲の外の場合にも浮動小数点数として返されます。

ただ、整数のサイズはプラットフォームによって異なる場合があります。
プラットフォームとはOSの種類や環境の設定のことです。

整数

$figure = 10;
$figure = 18000;

浮動小数点数(float)

PHPの変数で扱う浮動小数点数は、だいたい10進数で14桁の精度があります。

ただ、整数と同じくサイズは、プラットフォームの相違で異なる場合があります。

浮動小数点数

$floatnumber = 3.42641357;

文字列(string)

PHPの変数で扱う文字列は下記の3つの方法で指定します。

  • シングルクォーテーション(引用符)
  • ダブルクォーテーション(二重引用符)
  • ヒアドキュメント

文字列を指定する一般的な方法は、シングルクォーテーション「'」で括ります。文字列をダブルクォーテーション「"」で括った時は、特殊文字のエスケープシークエンスを多く使用することが出来ます。ヒアドキュメントは、PHP内にまとまった文章を直接記述し利用できるようにする方法です。

エスケープシークエンス(escape sequence)は、出力の表示結果を制御したりするための特殊な文字のことです。

文字列

$name = "山田 花子";
$address = "東京都新宿区百人町"
$telnumber = "03-1234-5678"

PHPの主なエスケープシークエンス

¥n ラインフィード
¥r キャリッジリターン
¥t 水平タブ
¥¥ バックスラッシュ
¥$ ドル記号
¥" 二重引用符

エスケープシーケンスの例

    <?php
        echo( "はじめまして。<br />¥n" );
        echo( "私は¥"山田花子¥"と申します。<br />¥n" );
        echo( "職業はバイヤーで、 ¥$100 で仕入れてきた海外の洋服を<br />¥n" );
        echo( "定価 ¥¥20,000 で販売しています。<br />¥n" );
        echo( "取り扱いサイズ<br />¥n" );
        echo( "¥t28<br />¥r" );
        echo( "¥t30<br />¥r" );
        echo( "¥t32<br />¥r" );
    ?>
    

ブラウザ出力結果

はじめまして。
私は"山田花子"と申します。
職業はバイヤーで、 $100 で仕入れてきた海外の洋服を
定価 ¥20,000 で販売しています。
取り扱いサイズ
28
30
32

HTMLソース

はじめまして。<br />
私は"山田花子"と申します。<br />
職業はバイヤーで、 $100 で仕入れてきた海外の洋服を<br />
定価 ¥20,000 で販売しています。<br />
取り扱いサイズ<br />
    28<br />
    30<br />
    32<br />

文字列内での変数展開

文字列内で変数を扱う場合、ダブルクォーテーション「"」を使用した場合には変数が展開されますが、シングルクォーテーション「'」を使用した場合には展開されません。

    <?php
        $name1 = "山田 花子";
        $name2 = "山田 太郎";
        $name3 = "山田 二郎";

        echo "私の名前は $name1 です。<br />¥n";
        echo "私の名前は$name2です。<br />¥n";
        echo '私の名前は $name3 です。';
    ?>
    

実行結果

私の名前は 山田 花子 です。
私の名前は
私の名前は $name2 です。

このように、シングルクォーテーション「'」の場合には、変数の中身が取り出されずそのまま表示されます。

それでは、$name2の"山田 太郎"は、なぜ表示されなかったのでしょうか。
理由は、echoの「$name2」前後に半角スペースをつけなかった場合、PHPでは「$name2」を変数とは扱かわず、「$name2です。」を変数として扱ってしまうからです。

これを回避する一つの方法として、変数を波括弧「{ }」で囲むという方法があります。

    <?php
        $name2 = "山田 太郎";

        echo "私の名前は{$name2}です。";
    ?>
    

実行結果

私の名前は山田 太郎です。

複合型[変数の型]

複合型

空白 型名 説明
array 配列型 array関数により指定された配列
object オブジェクト型 new命令によりオブジェクトのインスタンスを変数に作成

スカラー型とは、常に一つの値を保持している変数のことでしたが、一方でPHPには、複数の値を格納する変数を扱うことができます。このような変数のことを「非スカラー変数」と呼びます。この非スカラー変数にも様々な種類がありますが、その代表的な非スカラー変数として「配列」があります。

なお、オブジェクト型のオブジェクトとは、「オブジェクト指向」という概念に基づいたプログラミング手法のことですが、ここでは配列を重視して解説していきます。

配列に値を代入する

配列は変数名の最後に「[]角かっこ」を付けると配列として機能します。また変数と同じで、値を代入するとデータの型を考えずに使用することができます。

配列$animalにインデックスを指定して値を代入

    <?php
        $animal[] = "牛";
        $animal[] = "馬";
        $animal[] = "鹿";

        echo "$animal[ 0 ]<br />¥n";
        echo "$animal[ 1 ]<br />¥n";
        echo "$animal[ 2 ]<br />¥n";
    ?>
    

実行結果



鹿

前述のスクリプトでは、インデックスに値を指定せずに、 "牛"などの値だけを代入しています。また、インデックスの値を指定していないので、自動的に「牛」、「馬」、「鹿」と表示されています。

配列$animalにインデックスを指定して値を代入

    <?php
        $animal[ 2 ] = "牛";
        $animal[ 1 ] = "馬";
        $animal[ 3 ] = "鹿";

        echo "$animal[ 1 ]<br />¥n";
        echo "$animal[ 2 ]<br />¥n";
        echo "$animal[ 3 ]<br />¥n";
    ?>
    

実行結果



鹿

前述のスクリプトでは、インデックスを指定して値を代入しています。インデックスで指定した順番に表示されていることがわかります。

ループを使って配列の値を出力する

配列のインデックスに続いた数値が割り当てられている時には、ループ処理を使用して、配列の値を出力することができます。

このループ処理により、より少ないコードを記述することが可能になります。

forループ処理で配列の値を出力

    <?php
        $animal = array( "牛", "馬", "鹿", "犬", "猫" );
        $number = count( $animal );

        for( $i = 0; $i < $number; $i++ ) {

            echo "$animal[ $i ]<br />¥n";
        }
    ?>
    

実行結果



鹿

前述のスクリプトでは、配列$animalのインデックスを0から割り当てているので、出力する際に何度もechoを記述することがなく、ループ(繰り返し)の処理によって出力されています。また、count関数により配列$animalの要素、今回の場合は五つを取得しつつ、forの条件(要素が五つなので五回繰り返す)でループがなされています。「$i++」はループ処理が実行されるたびに、「$i = 0;」へ1がプラスされるという意味です。この「$i++」によってループされるたびに0回目は「牛」だよー、1回目は「馬」だよー、2回目は「鹿」だよー、3回目は「犬」だよー、4回目は「猫」だよーと教えています。

上記のスクリプトの「$i = 0;」の値を「$i = 2;」とした場合は、「0」が「牛」、「1」が「馬」、「2」が「鹿」、「3」が「犬」、「4」が「猫」となっているので、実行結果は「鹿」、「犬」、「猫」となります。

インデックスが文字列の連想配列

文字列をインデックスに割り当てる

配列となっているインデックスには、数字だけでなく、文字列を割り当てることもできます。

インデックスに文字列を割り当て

    <?php
        $animal[ "dog" ] = "犬";
        $animal[ "cat" ] = "猫";
        $animal[ "horse" ] = "馬";

        echo "$animal[ cat ]<br />¥n";
        echo "$animal[ dog ]<br />¥n";
    ?>
    

実行結果


前述のスクリプトは連想配列と呼ばれるもので、各動物の英語表記と日本語表記が対応しています。

対応している、一番目の値の英語表記がインデックスに割り当てられます。スクリプトでは一番目には「犬」を記述していますが、echoではじめに[cat]を記述してるので、「猫」が表示されます。「馬」はechoしていませんので、表示はされません。また、犬なのでかならず["dog"]としなければいけないわけではありません。["pig"]としても=(イコール)の右辺が"犬"であり、echoに「$animal[ pig ]」とすれば、犬が表示されます。ただ、連想しやすい記述をしたほうが望ましいでしょう。

以上のスクリプトのように["dog"] = "犬"と関連付けることから、連想配列と呼ばれます。

ループを使って連想配列の値を出力する

連想配列は、インデックスに文字列を割り当てているために、通常の配列のようにループの回数を使用して配列の値を出力することができません。ですが、list関数each関数を使用することによって、同じように出力させることができます。

list関数とeach関数で値を出力する

    <?php
        $animal = array( "dog" => "犬", "cat" => "猫", "hose" => "馬" );

        while( list( $key, $val ) = each( $animal ) ) {

            echo ( "インデックスの $key は、$val です<br />¥n" );
        }
    ?>
    

実行結果

インデックスの dog は、犬 です
インデックスの cat は、猫 です
インデックスの hose は、馬 です

前述のスクリプトではeach関数によって、連想配列の$animalの値をキーと値のペアで返し、list関数は複数の変数への代入を行うことができ、ここでは変数$keyと$valに出力する値を割り当てています。また、通常each()はその特性によりlist()と共に使用されます。

「while」は、繰り返しの処理をさせるために使用しています。もし、ここで「while」ではなく「if」を使用したのなら実行の結果は、「インデックスの dog は、犬 です」のみが表示されます。

連想配列をソートする

連想配列では以下の関数を使用することにより、インデックスと値の関係を保持したまま、並びを変更することができます。

asort() 連想配列を昇順に並び替える。
arsort() 連想配列を降順に並び替える。
ksort() 連想配列のインデックスの昇順に並び替える。
krsort() 連想配列のインデックスの降順に並び替える。

連想配列$animalを降順に並び替える

    <?php
        $animal = array( "dog" => "犬", "cat" => "猫", "hose" => "馬" );
        arsort( $animal );

        while( list( $key, $val ) = each( $animal ) ) {

          echo( "インデックスの $key は、$val です<br />¥n" );
        }
    ?>
    

実行結果

インデックスの hose は、馬 です
インデックスの cat は、猫 です
インデックスの dog は、犬 です

前述のスクリプトでは、arsort()によって降順に出力されていることがわかります。

配列を操作する関数

配列を作成する

array関数は配列を作成します。

array(var,...)

array関数で配列を作成

配列とは、仕切りのある箱と考えてください。箱で区切られた各要素には、番号または任意の文字列で名前をつけることができます。

    <?php
        $animal1 = array( "犬", "猫", "馬" );
        $animal2 = array( "dog" => "犬", "cat" => "猫", "hose" => "馬" );
    ?>
    

上記のスクリプトでは、$animal1はインデックスが0からなる連番で作成される配列、$animal2はインデックスに文字列が割り当てられる連想配列が作成されます。

このまま実行しても何も表示されないので、以下の用にvar_dumpを使用して各変数がどのようになっているか見てみましょう。var_dump();の「()かっこ」の中に変数を入れるとその中身を確認することができます。

    <?php
        $animal1 = array( "犬", "猫", "馬" );
        $animal2 = array( "dog" => "犬", "cat" => "猫", "hose" => "馬" );

        var_dump($animal1);echo"<br />";
        var_dump($animal2);
    ?>
    

実行結果

array(3) { [0]=> string(2) "犬" [1]=> string(2) "猫" [2]=> string(2) "馬" }
array(3) { ["dog"]=> string(2) "犬" ["cat"]=> string(2) "猫" ["hose"]=> string(2) "馬" }

変数$animal1の「array(3)」の「3」とは要素の数を意味しています。「犬」、「猫」、「馬」なので「3」となります。「string(2)」とは文字のバイト数を意味しています。もし、ここで「犬犬」としてあれば「string(4)」となります。「[0]=> string(2) "犬"」の「[0]」はインデックス番号を意味しています。インデックス番号は自動で0から割り当てられます。以上から「犬」の例では犬文字列はインデックス番号0の2バイト文字だよーといっています。それが3番の馬まで連続で続いています。

変数$animal2の「["dog"]=> string(2) "犬"」の「["dog"]」はスクリプトの「 "dog"」を意味しています。「string(2)」は変数$animal1と同じ意味です。変数$animal1と大きな違いは変数$animal1は[]が番号が割り当てられているのに対し、変数$animal2は連想される文字列が割り当てられています。

配列の要素を数える

count関数は、引数として与えられる配列の要素の数を返します。

count(array)
    <?php
        $animal = array( "犬", "猫", "馬" );
        echo count( $animal );
    ?>
    

実行結果

3

前述のスクリプトでは、count関数によって配列arrayの要素の数を取得しています。"犬"、"猫"、"馬"と3つあるので3となります。

配列を並べ替える

sort関数は、配列の要素を数字やアルファベットの昇順に並べ替えることができます。

sort(array)
    <?php
        $figure = array( "5", "2", "3", "1", "4" );
        sort( $figure );

        while( list( $key, $val ) = each( $figure ) ) {

            echo "$val<br />¥n";
        }
    ?>
    

実行結果

1
2
3
4
5

sort関数によって、"5","2","3","1","4"とバラバラになって並んでいる数値が、"1","2","3","4","5"と昇順に並び替えられていることがわかります。

一意の要素を抽出する

配列の値に重複して存在している値がある場合、array_unique関数を使用して重複している値を取りの除くことができます。

array_unique関数は、引数として与えられた配列から重複する値を取り除き、その重複している値が取り除かれた状態で配列を返します。

array_unique(array)

重複した値を取り除き、配列を返す

    <?php
        $animal = array( "dog", "cat", "hose", "monkey", "pig", "dog" );
        $unique = array_unique( $animal );

        while( list( $key, $val ) = each( $unique ) ) {

            echo "$val<br />¥n";
        }
    ?>
    

実行結果

dog
cat
hose
monkey
pig

前述のスクリプトでは重複している"dog"が取り除かれて出力されていることがわかります。

配列同士の差分を求める

2つの配列があった場合に、array_diff関数を使用し、一方の配列には存在して、もう一方の配列には存在しない要素を抽出することができます。

array_diff関数は、1つ目の引数の配列要素で、2つ目以降の引数の配列に存在しない値を返します。

array_diff(array)

配列同士の差分を抽出する

    <?php
        $animal1 = array( "dog", "cat", "hose", "monkey", "pig" );
        $animal2 = array( "dog", "cat", "hose", "monkey" );

        $diff = array_diff( $animal1, $animal2 );

        while( list( $key, $val ) = each( $diff ) ) {

           echo "$val<br />¥n";
        }
    ?>
    

実行結果

pig

前述のスクリプトでは、「$diff = array_diff( $animal1, $animal2 );」で「$animal1」と「$animal2」が比較されています。結果、1つ目の配列$animal1の要素である「pig」が、2つ目の配列$animal2に存在しないので、配列diffに返されpigが出力されています。

特別型

特別型

空白 型名 説明
NULL ヌル型 「NULL」大文字・小文字は区別しない
resource リソース型 データベースやファイルなどの外部リソースへのリファレンスを保持。

ヌル(NULL)

NULL値は、値を持たないことを意味します。

NULLは「NULL」がただ一つの値です。また、NULLは大文字と小文字の区別はありません。

変数を定義する際、下記のような場合にはその変数はNULL(値がない)になります。

  • 定数にNULLが代入がされている。
  • 変数に値が代入されていない。

NULL値

$number = NULL;

上記のように記述した場合、変数$numberはNULLとなります。

リソース(resource)

リソースとは、ファイルへの接続、データベースへの接続など、外部へと繋がる特殊な変数のことです。つまり、ファイル操作やデータベース操作をして値を取り出し、その値を格納している変数ということになります。

$fileopen = fopen( "sample.txt", "r" );

上記のテキストファイルを外部から参照するといったような場合、変数fileopenはリソースになります。

それぞれのデータ型を変換する

数値や文字列を同じ変数に代入する

PHPの変数は値を代入したその時に、変数の型がきまります。あらかじめ型を定義する定数とは大きく異なっています。

以上から、同じ変数名に対して、数値を代入したり、文字列を代入することができます。

同じ変数名に対して数値と文字列を代入することができる

$str = 123456789;
$str = "あいうえお";

整数と浮動少数点数の相互変換

PHPでは整数と浮動小数点数をそれぞれの変数に代入し、計算をすると浮動小数点数で結果が表されます。

    <?php
        $number1 = 5;
        $number2 = 10.2;

        $sum = $number1 + $number2;

        echo $sum;
    ?>
    

実行結果

15.2

浮動小数点で出力されていることがわかります。

数値と文字列の演算

PHPでは文字列と数値で演算をすると、文字列を数値と解釈して計算を実行します。

ただ、数値に置き換えられるのは、文字列の先頭から来る数値の部分のみです。「あかさたな」などの文字列部分は置き換えられません。

数値に置き換えられない文字列

    <?php
        $number = 123456789;
        $str = "あかさたな";

        $sum = $number + $str;

        echo $sum;
    ?>
    

実行結果

123456789

計算の結果が数値で出力されていることがわかります。

数値に置き換えられる文字列

    <?php
        $number = 123456789;
        $str = "100000000あかさたな";

        $sum = $number + $str;

        echo $sum;
    ?>
    

実行結果

223456789

$strが100000000と解釈され、123456789に足されていることがわかります。

それぞれの型を指定して変換する

PHPでは変数を型キャストすると、整数を浮動小数点数に、浮動小数点数から整数へと型を指定し、置き換えることができます。その場合キャストをする変数の前に、置き換える型を括弧で括ります。

また、浮動小数点数から整数へ型キャストした時はその数はゼロに丸めこまれます。

型キャストで指定できる型

整数 int、integer
論理値 bool、boolean
浮動小数点数 float、double、real
文字列 string
配列 array
オブジェクト object

整数と浮動少数点数の型キャスト

浮動小数点数から整数への型キャスト

    <?php
        $z = 1.23456;
        $z = (int) $z;

        echo $z;
    ?>
    

実行結果

1

小数点以下が切り捨てられ、1となっていることがわかります。

浮動小数点数から文字列型への型キャスト

    <?php
        $z = 1.23456;
        $z = (string) $z;

        echo $z;
    ?>
    

実行結果

1.23456

表示的には数値に見えますが、stringの型を使用していますので、これは概念的には文字列となっています。

わかりやすくするため、var_dump();をしてみます。

    <?php
        $z = 1.23456;
        $z = (string) $z;

        var_dump($z);
        echo $z;
    ?>
    

上記スクリプトで「var_dump($z);」とすることで、変数$zがどういう状態なのかがわかります。

実行結果

string(7) "1.23456" 1.23456

「string(7) "1.23456"」の「string(7)」で文字列と認識されているのがわかります。「(7)」は小数点を含めた数を意味しています。