<学習する内容>
配列データを扱えるようになると、プログラムが簡素化されわかりやすくなります。まずは、新幹線の座席数の表示を例として
配列データの考え方を解説しプログラムを書きながら学習します。
1)配列データの考え方
1つの変数の中に複数の値が入っているものが配列データです。新幹線で説明します。のぞみ1号の号車毎の座席数を表してみます。
座席数一覧
号車 | 座席数 |
1号車 | 65名 |
2号車 | 100名 |
3号車 | 85名 |
4号車 | 100名 |
5号車 | 90名 |
6号車 | 100名 |
7号車 | 75名 |
8号車 | 68名 |
9号車 | 64名 |
10号車 | 68名 |
11号車 | 63名 |
12号車 | 100名 |
13号車 | 90名 |
14号車 | 100名 |
15号車 | 80名 |
16号車 | 75名 |
表1
|
|
変数に代入例
号車 | 代入式 |
1号車 | $nozomi1_1=65 |
2号車 | $nozomi1_2=100 |
3号車 | $nozomi1_3=85 |
4号車 | $nozomi1_4=100 |
5号車 | $nozomi1_5=90 |
6号車 | $nozomi1_6=100 |
7号車 | $nozomi1_7=75 |
8号車 | $nozomi1_8=68 |
9号車 | $nozomi1_9=64 |
10号車 | $nozomi1_10=68 |
11号車 | $nozomi1_11=63 |
12号車 | $nozomi1_12=100 |
13号車 | $nozomi1_13=90 |
14号車 | $nozomi1_14=100 |
15号車 | $nozomi1_15=80 |
16号車 | $nozomi1_16=75 |
表2
|
|
配列に代入
号車 | 代入式 |
1号車 | $nozomi1[1]=65 |
2号車 | $nozomi1[2]=100 |
3号車 | $nozomi1[3]=85 |
4号車 | $nozomi1[4]=100 |
5号車 | $nozomi1[5]=90 |
6号車 | $nozomi1[6]=100 |
7号車 | $nozomi1[7]=75 |
8号車 | $nozomi1[8]=68 |
9号車 | $nozomi1[9]=64 |
10号車 | $nozomi1[10]=68 |
11号車 | $nozomi1[11]=63 |
12号車 | $nozomi1[12]=100 |
13号車 | $nozomi1[13]=90 |
14号車 | $nozomi1[14]=100 |
15号車 | $nozomi1[15]=80 |
16号車 | $nozomi1[16]=75 |
表3
|
配列化すると表3のようになります。表2とに違いは$nozomi1という変数1つで取り扱えるます。
一見すると表2とは表記が少し違うだけでですがデータとして取り扱う場合圧倒的に便利になります。
では実際にデータを代入して表1を作成するプログラムを書いてみましょう。
<配列を使わない場合>
<?php
//データの代入
$nozomi1_1 = 65;
$nozomi1_2 = 100;
$nozomi1_3 = 85;
$nozomi1_4 = 100;
$nozomi1_5 = 90;
$nozomi1_6 = 100;
$nozomi1_7 = 75;
$nozomi1_8 = 68;
$nozomi1_9 = 64;
$nozomi1_10 = 68;
$nozomi1_11 = 63;
$nozomi1_12 = 100;
$nozomi1_13 = 90;
$nozomi1_14 = 100;
$nozomi1_15 = 80;
$nozomi1_16 = 75;
echo <<<EOT
<table border="1" style="border-collapse: collapse;">
<tr align="center" bgcolor="#dcdcdc"><td width="60">号車</td><td width="60">座席数</td></tr>
<tr align="center"><td>1号車</td><td>{$nozomi1_1}名</td></tr>
<tr align="center"><td>2号車</td><td>{$nozomi1_2}名</td></tr>
<tr align="center"><td>3号車</td><td>{$nozomi1_3}名</td></tr>
<tr align="center"><td>4号車</td><td>{$nozomi1_4}名</td></tr>
<tr align="center"><td>5号車</td><td>{$nozomi1_5}名</td></tr>
<tr align="center"><td>6号車</td><td>{$nozomi1_6}名</td></tr>
<tr align="center"><td>7号車</td><td>{$nozomi1_7}名</td></tr>
<tr align="center"><td>8号車</td><td>{$nozomi1_8}名</td></tr>
<tr align="center"><td>9号車</td><td>{$nozomi1_9}名</td></tr>
<tr align="center"><td>10号車</td><td>{$nozomi1_10}名</td></tr>
<tr align="center"><td>11号車</td><td>{$nozomi1_11}名</td></tr>
<tr align="center"><td>12号車</td><td>{$nozomi1_12}名</td></tr>
<tr align="center"><td>13号車</td><td>{$nozomi1_13}名</td></tr>
<tr align="center"><td>14号車</td><td>{$nozomi1_14}名</td></tr>
<tr align="center"><td>15号車</td><td>{$nozomi1_15}名</td></tr>
<tr align="center"><td>16号車</td><td>{$nozomi1_16}名</td></tr>
</table>
EOT;
?>
このようになります。
<配列の場合>
<?php
//データの代入
$nozomi1 = [
65,
100,
85,
100,
90,
100,
75,
68,
64,
68,
63,
100,
90,
100,
80,
75
];
for ($i = 0;$i < count($nozomi1);$i++) {
$num = $i + 1;
$HTML .= '<tr align="center"><td>'.$num.'号車</td><td>'.$nozomi1[$i].'名</td></tr>';
}
echo <<<EOT
<table border="1" style="border-collapse: collapse;">
<tr align="center" bgcolor="#dcdcdc"><td width="60">号車</td><td width="60">座席数</td></tr>
{$HTML}
</table>
EOT;
?>
プログラムがスッキリしたのがわかります。
<解説>
3行目データの投入
配列の場合4行名以降の [ ] で囲み記述します。この変数$nozomi1はecho文では表示させることはできません。
表示には print_r() か var_dump() を使います。
例)
$a = [1,2,3,'A','B'];
print_r($a);
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => A [4] => B )
var_dump($a);
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> string(1) "A" [4]=> string(1) "B" }
データとして扱うには変数横に[]記述し[]内に記述した順を入れます。
例)
echo $a[3];
A と表示されます。
順の数え方は1からではなく0からとなります。
23行目for文
for文を使って変数の値を順番に取り出します。
$i = 0 は初期値、$i++ は1づつ、count($nozomi1)の要素数(データ数)です。
0から順番に1づつ15までの値を取出します。
24行目の$num
$iは0から始まるので1を足し号車とします。
25行目の$HTML
変数$HTMLに
******
のHTML文を登録していきます。
$HTML
.= '
*****
' この
ドットイコールで =以下の文を$HTMLに追加してくれます。
あとは31行目のHTML文を内にれて上げれば表示されます。
2)2次元配列の使い方
次に座席のデータも配列化します。
1)では、[]内が数値でしたが、下記のように[]内にさらに[]の配列データがあるのが2次元配列です。
$nozomi1=[
['〇','×','〇','×','〇'], 0行目
['〇','〇','〇','
×','〇'], 1行目
['〇','×','×','〇','〇'] 2行目
];
この赤色で表示された×を抽出します。
echo $nozomi1[1][3]; 1行目の左から0から数えて3番目となります。
<?php
//データの代入
$nozomi1=[
['〇','×','〇','×','〇'], //0行目
['〇','〇','〇','×','〇'], //1行目
['〇','×','×','〇','〇'] //2行目
];
for ($i = 0;$i < count($nozomi1);$i++) {
$num = $i + 1;
$HTML .= '<tr align="center">';
$HTML .= ' <td>'.$num.'行目</td>';
for ($j = 0;$j < 5;$j++) {
$HTML .= ' <td>'.$nozomi1[$i][$j].'</td>';
}
$HTML .= '</tr>';
}
echo <<<EOT
<table border="1" style="border-collapse: collapse;">
<tr align="center" bgcolor="#dcdcdc">
<td width="60">行</td>
<td width="60">A</td>
<td width="60">B</td>
<td width="60">C</td>
<td width="60">D</td>
<td width="60">E</td>
</tr>
{$HTML}
</table>
EOT;
?>
3)連想配列の使い方
1)では0から順番にデータ配列化させてましたが、0からの順番ではなくkeyという名前で配列化します。
例)
①配列
$nozomi1 = [
65,
100,
85,
100
];
②連想配列
$nozomi1 = [
'1号車' => 65,
'2号車' => 100,
'3号車' => 85,
'4号車' => 100,
];
print_r($nozomi1);で見てみましょう。
①の場合 Array ( [0] => 65 [1] => 100 [2] => 85 [3] => 100 )
②の場合 Array ( [1号車] => 65 [2号車] => 100 [3号車] => 85 [4号車] => 100 )
このように連想配列になると順番の数字が入るところに*号車というキーが入ってます。
配列の順番ではなく配列を入れる箱にキーという名前をつけているのが連想配列となります。
今までSQL文で抽出した$rowも連想配列となります。
$row["sectionName"]; このようには$rowよりキーがsectionNameを抽出してます。
<?php
//データの代入
$nozomi1 = [
'1号車' => 65,
'2号車' => 100,
'3号車' => 85,
'4号車' => 100,
];
echo '3号車の座席数を抽出: '.$nozomi1['3号車'].'
';
foreach ($nozomi1 as $gosya => $val) {
$HTML .= '<tr align="center">';
$HTML .= ' <td>'.$gosya.'</td>';
$HTML .= ' <td>'.$nozomi1[$gosya].'</td>';
$HTML .= '</tr>';
}
echo <<<EOT
<table border="1" style="border-collapse: collapse;">
<tr align="center" bgcolor="#dcdcdc">
<td width="60">号車</td>
<td width="60">座席数</td>
</tr>
{$HTML}
</table>
EOT;
?>
<解説>
11行目データ抽出
変数$nozomi[ ] で囲み内取り出したいキー['3号車']を記述します。
※キーにはシングル(ダブル)コーテーション囲う必要があります。
13行目foreach文での取出し
データ抽出はforeach文を使います。
foreach ($nozomi1 as $gosya => $val) { }
foreach (データのある配列 as 取出すキー => 取出す変数) { }
取出すキーの変数名は後で取出すとき(15,16行目)にわかりやするため$gosyaとしています。任意で命名します。
取出す変数$valですが任意で命名します。あとで使用する変数ではありませんがキーを取出すために必要な記述です。