配列

変数をたくさん扱うそんなプログラムがあると思います。

例えば、変数を100個使用するとします。

$a$b$c....のように100個の変数を記述していくのは面倒ですね。こんな時に便利なのが「配列」です。

変数「$i=123」のように、一つの値だけを格納していました。一つのくせに、たくさんの値を格納できるという便利な変数があります。それが「配列」です。

例えば、$iroという一つの配列変数はiro[0],iro[1],iro[2],iro[3],iro[4]......のようにたくさんの「要素」で構成されています。

配列の変数名には[ ]を付け、この[ ]の中に各「要素」を特定するための「キー」を指定します。各「要素」が持つデータを「値」といいます。

 

f:id:mkyosuke:20191127181713p:plain

上の画像では、$iroという配列は、「0」「1」「2」....という「キー」を指定した「要素」iro[0],iro[1],iro[2],...から構成され、それぞれの「要素」はiro[0]="red",iro[1]="olive",iro[2]="yellow"...のように特定の「値」を保管することができる、ということです。

配列の作成1

・配列変数に順番に値を代入

 最も単純なのは、配列変数に順番に代入していく方法です。

書式

$配列名[キー]  =  値;

  キーは省略することが出来ます。次の場合は、最初に代入したものから$iro[0],$iro[1],$iro[2]....となります。

$iro="red";

$iro="olive";

$iro="yellow";

$iro="green";

注意したいのは、配列のキーは「0」から始まる連番であるという事です。

PHPだけでなく、プログラムの世界は配列の最初は「0」からスタートになります。

キーの値を選んで、直接任意の要素に値を代入することもできます。

$iro[4]="blue";

$iro[0]="red";

$iro[2]="yellow";

$iro[1]="olive";

この場合、代入した順番には関係なく、任意のキーに対応する値が代入できます。

また、いきなり$iro[777]="white"のように突発的なキーを使う事ができますが、使ってないキーの部分のメモリを無駄に消費してしまいます。

 

配列の作成2

・array関数を使う

 配列を作成し、値を代入するときよく使われるarray関数です。

書式

$配列名 = array(値1,値2,値3,......);

$iro = array("red","olive",yellow","green","blue","purple");

 

・配列の値を取り出す

 今度は入力済みの配列に対する操作です。配列の値を取り出す場合は、

 $配列名[キー]で取り出すことができます。

●for文を使う

まずは、for文による繰り返し処理で、配列の値を取り出す方法です。

次の例は、array関数で配列$iro[0]~[5]を定義し、さらにそれぞれの要素がもつ値を書き出しているものです。for文のカウンタ変数($n)を配列のキーとすることで、配列の値を書き出しています。

例1

<?php
$iro = array("red","olive","yellow","green","blue","purple");

for ($n = 0;$n<=5; $n++)
  print $iro[$n]."<br>";
?>

実行結果

f:id:mkyosuke:20191128130635p:plain

 

・要素の数をcount関数で調べてfor文を使う

配列の要素数がわからない場合はcount関数で調べる事できます。

<?php
$iro = array("red","olive","yellow","green","blue","purple");
$c = count($iro);

for ($n = 0;$n<=$c-1 $n++){
  print $iro[$n]."<br>";
}
?>

実行結果

f:id:mkyosuke:20191128131708p:plain

$cには要素数の6が入るので、終了条件は「$c-1」と1を減らして「5」にする必要があります。なぜなら配列のキーは「0」から始まるからです。

・list関数で配列の値を取り出す

すでに入力済みの配列の値を取り出すとき、list関数は便利です。listは配列の要素と同じ順番で、指定した変数に値を代入する関数です。

関数 list

書式 list(変数0,変数1,変数2....) = 配列

機能 「配列」の要素と同じ順番で、値を「変数0」、「変数1」....に代入する

次は、「きつね」「ねこ」「こあら」を要素とする配列$aの各値を、それぞれ変数$x,$y$zに代入するものです。

例2

<?php
$a = array("きつね","ねこ","こあら");

list($x,$y,$z) = $a;
print $x."と".$y."と".$z;
?>

実行結果

f:id:mkyosuke:20191128132917p:plain

 

・print_r関数を使う

print_rは変数に関する情報を表示する関数です。

print_rの引数に配列を指定すると、すべての要素の「キー」と「値」をわかりやすい形式で表示します。配列の値を表示させたいならば、print_rを使うのが最も簡単です。

関数 print_r

書式 「$変数」の内容を表示する

返り値 なし

 

連想配列

配列で指定するキーは、必ずしも$a[0],$a[1],$a[2]...のように整数にする必要はありません。任意の文字列を使うことができます。これを通常の配列と区別して、

連想配列」といいます。

例えば1週間の売り上げを$salesの配列で表すとします。そして曜日ごとの売り上げを次のように連想配列で設定するものとします。

日曜日の売上 ➡ $sales["sun"]

月曜日の売上 ➡ $sales["mon"]

火曜日の売上 ➡ $sales["tue"]

水曜日の売上 ➡ $sales["wed"]

連想配列のキーの文字は" "や' 'で囲います。

連想配列の作成

連想配列の作成方法は、通常の配列とほぼ同じです。まず、直接データを入力する場合は、次のようにします。

$sales["sun"] = 10;

$sales["mon"] = 20;

また、array関数を使用する場合は、次のように「=>」という記号を使います。

$sales = array("sun"=>10,"mon"=>20,"tue"=>30,"wed"=>40,"thu"=>50,"fri"=>60,"sat"=>70);

次は、土曜日と日曜日の合計だけを表示した例です。

例3

<?php

$sales = array("sun"=>10,"mon"=>20,"tue"=>30,"wed"=>40,"thu"=>50,"fri"=>60,"sat"=>70);
print"土日の合計は".($sales["sat"]+$sales["sun"])."です。";
?>

実行結果

f:id:mkyosuke:20191128140703p:plain

・スーパーグローバル変数

PHPでは、わざわざユーザーが設定しなくともあらかじめその内容が定義され、いつでも利用可能な変数があります。これをスーパーグローバル変数といいます。

スーパーグローバル変数は、スコープを考えないでどこでも参照することができます。

 スーパーグローバル変数一覧

f:id:mkyosuke:20191128142226p:plain

 

よく利用されるスーパーグローバル変数$_SERVERを使ってみることにします。

$_SERVERは、現在の動作しているWebサーバーの情報を取得することができます。

次は、キーと取得できる情報の一例です。たくさんの情報を得る事ができます。

f:id:mkyosuke:20191128142730p:plain

次の例はIPアドレスを表示する処理をしています。

例4

<?php
print $_SERVER["SERVER_ADDR"];
?>

実行結果

f:id:mkyosuke:20191128143547p:plain

 

・foreachを使う

前の文章で、すべての配列を書き出すとき、その要素の数だけfor文をで繰り返して処理を行いました。 

しかしfor文だと、いちいちcount関数などで要素の数を調べる必要がありますし、連想配列のようにキーが整数でない場合は、大変使いにくいという欠点があります。

foreach文は配列専用のfor文で、回数を指定しなくても、とにかくすべての要素に対して「総当たりで」処理を繰り返します。カウンタ変数を用意する必要ありません。

foreachは次のように記述します。

書式 foreach ($配列名  as  $変数){

    要素の数だけ繰り返す処理

}

「$配列名」の後に「as」と任意の名前の「$変数」を記述します。これで、ある要素を処理するときの、その要素の値を「$変数」次々に代入します。

例5

<?php
$iro = array("red","olive","yellow","green","blue","purple");

foreach ($iro as $v)
 print $v."<br>";
?>

実行結果

f:id:mkyosuke:20191128145717p:plain


$iroという配列変数の一つ一つの要素に対して、総当たりで処理を行います。

一回目の繰り返しで$vに「red」の文字列が代入されますので、それに<br>を付けてprintで書き出しています。2回目は「olive」,3回目は「yellow」....が$vに次々に代入されて、繰り返し処理が続きます。そして配列の要素がなくなったらforeach文は終了します。

・キーを付けたforech

foreachで、各要素の値だけでなく、キー名も変数として使用したい場合は、次のような構文になります。

書式 foreach($配列名  as  $キーを表す変数  =>  $値を表す変数){

   要素の数だけ処理を繰り返す処理

}

次の例は、配列変数$salesのすべての要素のキーとその値を表示するものです。

例6

<?php
$sales = array("sun"=>10,"mon"=>20,"tue"=>30,"wed"=>40,"thu"=>50,"fri"=>60,"sat"=>70);

$sum = 0;

foreach($sales as $k => $v){
 print"キーが{$k}の要素の値は{$v}です<br>";
 $sum += $v;
}
print "すべての合計は{$sum}です。";
?>

実行結果

f:id:mkyosuke:20191128151544p:plain

まず全ての値の合計を計算する変数$sumを用意し、最初にこれを0とします。

foreach内では、配列のキー名を変数$kに、各要素の値を変数$vに代入して、すべての要素に対して処理を実行します。さらに各要素の処理のたびに、その値$vを足して、すべての処理が終了したら、合計として$sumを書き出しています。

 

多次元配列

PHPの配列では、配列の中にさらに配列をいれることもできます。

このように要素として配列を持つ配列を、「2次元配列」と呼びます。

そして2次元配列の要素として配列を持つのが3次元配列、さらに配列を持つ4次元配列.....となり、これらを総称して「多次元配列」と呼びます。

・配列の例

$a[0]="きつね";

$a[1]="ねこ";

$a[2]="こあら";

・2次元配列を作る場合は、キーを二つ指定します。たとえば次は、動物の種類を表す配列$a[]に対して、さらに「大」「小」を表す2番目の次元を設定したものです。

$a[0][0] = "きつね大";

$a[0][1] = "きつね小";

$a[1][0] = "ねこ大";

$a[1][1] = "ねこ小":

$a[2][0] = "こあら大";

$a[2][1] ="こあら小";

f:id:mkyosuke:20191128160500p:plain

array関数で作る場合は、次のように入れ子で実行します。

例7

<?php
$a = array(
     array("きつね大","きつね小"),
     array("ねこ大","ねこ小"),
     array("こあら大","こあら小")
);
print $a[0][0].$a[1][0].$a[2][0];
print"<br>";
print $a[0][1].$a[1][1].$a[2][1];
?>

実行結果

f:id:mkyosuke:20191128160015p:plain