webdata
DX推進をサポートする技術者向け情報提供サイト

初心者向けPHP・データベース入門

TOP >初心者向けPHP・データベース入門 >2.5 配列データの解説

【PHP入門】配列データの解説

 2023-06-15

<学習する内容>

 配列データを扱えるようになると、プログラムが簡素化されわかりやすくなります。まずは、新幹線の座席数の表示を例として 配列データの考え方を解説しプログラムを書きながら学習します。

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ですが任意で命名します。あとで使用する変数ではありませんがキーを取出すために必要な記述です。