PHPと配列の使い方

(1/1)
下表は、わが国の超高層ビルのトップ10を一覧表にしたものである。このような表形式のデータを扱うのに便利なデータ構造が配列である。PHPでは様々な配列が用意されており、その使い方を解説する。
番号 ビル名称
1 あべのハルカス
2 横浜ランドマークタワー
3 りんくうゲートタワービル
4 大阪府咲洲庁舎
5 ミッドタウン・タワー
6 ミッドランドスクエア
7 JRセントラルタワーズオフィス棟
8 東京都庁第一本庁舎
9 NTTドコモ代々木ビル
10 サンシャイン60
(2021年2月17日)PHP8対応,jQueryのリンク先更新,表デザイン変更,リファラチェック追加

目次

サンプル・プログラム(その1)

その1:配列の初期化

  85: // 配列の初期化 ============================================================
  86: $skyscrapers[1]  = 'あべのハルカス';
  87: $skyscrapers[2]  = '横浜ランドマークタワー';
  88: $skyscrapers[3]  = 'りんくうゲートタワービル';
  89: $skyscrapers[4]  = '大阪府咲洲庁舎';
  90: $skyscrapers[5]  = 'ミッドタウン・タワー';
  91: $skyscrapers[6]  = 'ミッドランドスクエア';
  92: $skyscrapers[7]  = 'JRセントラルタワーズオフィス棟';
  93: $skyscrapers[8]  = '東京都庁第一本庁舎';
  94: $skyscrapers[9]  = 'NTTドコモ代々木ビル';
  95: $skyscrapers[10] = 'サンシャイン60';
  96: 

配列は、普通の変数の末尾に [] を付ける。数字は添え字と呼び、上表の番号だと考えてもらえばよい。ここでは、変数 $skyscrapers が表全体をあらわす配列で、要素1つ1つに表の1行が格納されてゆく。

その1:表の作成

 125: /**
 126:  * HTML BODYを作成する
 127:  * @param   array $arr 超高層ビル一覧(配列)
 128:  * @return  string HTML BODY
 129: */
 130: function makeCommonBody1($arr) {
 131:     //一覧表作成
 132:     $table = '';
 133:     $n = count($arr);       //配列の要素数
 134:     for ($i = 1$i <$n$i++) {
 135:         $table .=<<< EOT
 136: <tr>
 137: <td style="text-align:center;">{$i}</td>
 138: <td>{$arr[$i]}</td>
 139: </tr>
 140: 
 141: EOT;
 142:     }
 143: 
 144:     //BODY作成
 145:     $myself = MYSELF;
 146:     $refere = REFERENCE;
 147:     $title  = TITLE;
 148:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 149:     $width  = WIDTH;
 150:     $debug  = '';
 151: 
 152:     //デバッグ情報
 153:     if (! FLAG_RELEASE) {
 154:         $phpver = phpversion();
 155:         $debug =<<< EOT
 156: <p>
 157: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 158: PHPver : {$phpver}
 159: 
 160: EOT;
 161:     }
 162: 
 163:     $body =<<< EOT
 164: <body>
 165: <h2>{$title} {$version}</h2>
 166: 
 167: <table class="stripe_table">
 168: <tr>
 169: <th>番号</th>
 170: <th>ビル名称</th>
 171: </tr>
 172: {$table}
 173: </table>
 174: 
 175: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 176: 参考サイト<br />
 177: <a href="{$refere}">{$refere}</a>
 178: {$debug}
 179: </div>
 180: </body>
 181: 
 182: EOT;
 183:     return $body;
 184: }

配列 $skyscrapers からHTMLのtableを作成する。
組み込み関数  count  は配列を引数とし、その配列の要素数を返す。これと for 文を使うことで、tableを作成する。

サンプル・プログラム(その2)

その2:配列の初期化

配列の初期化には、このような方法も使える。

  85: // 配列の初期化 ============================================================
  86: $skyscrapers[]  = 'あべのハルカス';
  87: $skyscrapers[]  = '横浜ランドマークタワー';
  88: $skyscrapers[]  = 'りんくうゲートタワービル';
  89: $skyscrapers[]  = '大阪府咲洲庁舎';
  90: $skyscrapers[]  = 'ミッドタウン・タワー';
  91: $skyscrapers[]  = 'ミッドランドスクエア';
  92: $skyscrapers[]  = 'JRセントラルタワーズオフィス棟';
  93: $skyscrapers[]  = '東京都庁第一本庁舎';
  94: $skyscrapers[]  = 'NTTドコモ代々木ビル';
  95: $skyscrapers[] = 'サンシャイン60';
  96: 

プログラムを実行すると分かるが、番号が0から始まっていることに注意が必要だ。
PHPは標準状態では、添字は0から始まり、+1ずつ増えるようになっている。

その2:表の作成

foreach 文を使うことで、添字の開始番号を気にすることなく表を作成することができる。

 125: /**
 126:  * HTML BODYを作成する
 127:  * @param   array $arr 超高層ビル一覧(配列)
 128:  * @return  string HTML BODY
 129: */
 130: function makeCommonBody2($arr) {
 131:     //一覧表作成
 132:     $table = '';
 133:     foreach ($arr as $key=>$val) {
 134:         $table .=<<< EOT
 135: <tr>
 136: <td style="text-align:center;">{$key}</td>
 137: <td>{$val}</td>
 138: </tr>
 139: 
 140: EOT;
 141:     }
 142: 
 143:     //BODY作成
 144:     $myself = MYSELF;
 145:     $refere = REFERENCE;
 146:     $title  = TITLE;
 147:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 148:     $width  = WIDTH;
 149:     $debug  = '';
 150: 
 151:     //デバッグ情報
 152:     if (! FLAG_RELEASE) {
 153:         $phpver = phpversion();
 154:         $debug =<<< EOT
 155: <p>
 156: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 157: PHPver : {$phpver}
 158: 
 159: EOT;
 160:     }
 161: 
 162:     $body =<<< EOT
 163: <body>
 164: <h2>{$title} {$version}</h2>
 165: 
 166: <table class="stripe_table">
 167: <tr>
 168: <th>番号</th>
 169: <th>ビル名称</th>
 170: </tr>
 171: {$table}
 172: </table>
 173: 
 174: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 175: 参考サイト<br />
 176: <a href="{$refere}">{$refere}</a>
 177: {$debug}
 178: </div>
 179: </body>
 180: 
 181: EOT;
 182:     return $body;
 183: }

サンプル・プログラム(その2)

その3:配列の初期化

配列の初期化には、組み込み関数  array  を使う方法もある。

  85: // 配列の初期化 ============================================================
  86: $skyscrapers = array(
  87: 'あべのハルカス',
  88: '横浜ランドマークタワー',
  89: 'りんくうゲートタワービル',
  90: '大阪府咲洲庁舎',
  91: 'ミッドタウン・タワー',
  92: 'ミッドランドスクエア',
  93: 'JRセントラルタワーズオフィス棟',
  94: '東京都庁第一本庁舎',
  95: 'NTTドコモ代々木ビル',
  96: 'サンシャイン60'
  97: );
  98: 

サンプル・プログラム(その4):2次元配列

2次元配列とは

Excelシートのような2次元の表データを格納するには、2次元配列を用いる。
2次元配列は $skyscrapers[1][2] のように表現する。最初の添字が表の行番号に、2つめの添字が列番号に相当すると考えてもらえばよい。

初期化は、組み込み関数  array  を二重に使う。

  85: // 配列の初期化 ============================================================
  86: $skyscrapers = array(
  87: array('あべのハルカス', '300m', '60階'),
  88: array('横浜ランドマークタワー', '295.8m', '70階'),
  89: array('りんくうゲートタワービル', '256.1m', '56階'),
  90: array('大阪府咲洲庁舎', '256.0m', '55階'),
  91: array('ミッドタウン・タワー', '248.1m', '54階'),
  92: array('ミッドランドスクエア', '246.9m', '47階'),
  93: array('JRセントラルタワーズオフィス棟', '245.0m', '51階'),
  94: array('東京都庁第一本庁舎', '242.9m', '48階'),
  95: array('NTTドコモ代々木ビル', '239.9m', '27階'),
  96: array('サンシャイン60', '239.7m', '60階')
  97: );
  98: 

その4:表の作成

ここでは、for 文を使ってtableを作成してみる。

 127: /**
 128:  * HTML BODYを作成する
 129:  * @param   array $arr 超高層ビル一覧(2次元配列)
 130:  * @return  string HTML BODY
 131: */
 132: function makeCommonBody4($arr) {
 133:     //一覧表作成
 134:     $table = '';
 135:     $n = count($arr);       //配列の要素数
 136:     for ($i = 0$i < $n$i++) {
 137:         $table .=<<< EOT
 138: <tr>
 139: <td style="text-align:center;">{$i}</td>
 140: <td>{$arr[$i][0]}</td>
 141: <td>{$arr[$i][1]}</td>
 142: <td>{$arr[$i][2]}</td>
 143: </tr>
 144: 
 145: EOT;
 146:     }
 147:     //BODY作成
 148:     $myself = MYSELF;
 149:     $refere = REFERENCE;
 150:     $title = TITLE;
 151:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 152:     $width  = WIDTH;
 153:     $debug  = '';
 154: 
 155:     //デバッグ情報
 156:     if (! FLAG_RELEASE) {
 157:         $phpver = phpversion();
 158:         $debug =<<< EOT
 159: <p>
 160: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 161: PHPver : {$phpver}
 162: 
 163: EOT;
 164:     }
 165: 
 166:     $body =<<< EOT
 167: <body>
 168: <h2>{$title} {$version}</h2>
 169: 
 170: <table class="stripe_table">
 171: <tr>
 172: <th>番号</th>
 173: <th>ビル名称</th>
 174: <th>高さ(m)</th>
 175: <th>階数</th>
 176: </tr>
 177: {$table}
 178: </table>
 179: 
 180: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 181: 参考サイト<br />
 182: <a href="{$refere}">{$refere}</a>
 183: {$debug}
 184: </div>
 185: </body>
 186: 
 187: EOT;
 188:     return $body;
 189: }

3次元配列は $skyscrapers[1][2]][3] 、4次元配列は $skyscrapers[1][2]][3]][4] のように表現する。これらを多次元配列と呼ぶ。

サンプル・プログラム(その5):2次元配列

その5:表の作成

次に、foreach 文を使って2次元配列から表を作成してみる。

 127: /**
 128:  * HTML BODYを作成する
 129:  * @param   array $arr 超高層ビル一覧(2次元配列)
 130:  * @return  string HTML BODY
 131: */
 132: function makeCommonBody5($arr) {
 133:     //一覧表作成
 134:     $table = '';
 135:     foreach ($arr as $key1=>$arr2) {
 136:         $table ."<tr>\n<td style=\"text-align:center;\">{$key1}</td>\n";
 137:         foreach ($arr2 as $key2=>$val) {
 138:             $table ."<td>{$val}</td>\n";
 139:         }
 140:         $table ."</tr>\n";
 141:     }
 142:     //BODY作成
 143:     $myself = MYSELF;
 144:     $refere = REFERENCE;
 145:     $title = TITLE;
 146:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 147:     $width  = WIDTH;
 148:     $debug  = '';
 149: 
 150:     //デバッグ情報
 151:     if (! FLAG_RELEASE) {
 152:         $phpver = phpversion();
 153:         $debug =<<< EOT
 154: <p>
 155: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 156: PHPver : {$phpver}
 157: 
 158: EOT;
 159:     }
 160: 
 161:     $body =<<< EOT
 162: <body>
 163: <h2>{$title} {$version}</h2>
 164: 
 165: <table class="stripe_table">
 166: <tr>
 167: <th>番号</th>
 168: <th>ビル名称</th>
 169: <th>高さ(m)</th>
 170: <th>階数</th>
 171: </tr>
 172: {$table}
 173: </table>
 174: 
 175: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 176: 参考サイト<br />
 177: <a href="{$refere}">{$refere}</a>
 178: {$debug}
 179: </div>
 180: </body>
 181: 
 182: EOT;
 183:     return $body;
 184: }

サンプル・プログラム(その6):連想配列

連想配列とは

PHPの配列は、添字に文字列を使うことができる。これをとくに連想配列と呼ぶ。
連想配列は $skyscrapers['あべのハルカス'][0] のように表現する。

ここでは、行番号の代わりにビル名を使って初期化してみる。高さと階数は数値データにした。

  85: // 配列の初期化 ============================================================
  86: $skyscrapers = array(
  87: 'あべのハルカス' => array(300, 60),
  88: '横浜ランドマークタワー' => array(295.8, 70),
  89: 'りんくうゲートタワービル' => array(256.1, 56),
  90: '大阪府咲洲庁舎' => array(256.0, 55),
  91: 'ミッドタウン・タワー' => array(248.1, 54),
  92: 'ミッドランドスクエア' => array(246.9, 47),
  93: 'JRセントラルタワーズオフィス棟' => array(245.0, 51),
  94: '東京都庁第一本庁舎' => array(242.9, 48),
  95: 'NTTドコモ代々木ビル' => array(239.9, 27),
  96: 'サンシャイン60' => array(239.7, 60)
  97: );
  98: 

その5:表の作成

次に、foreach 文を使って連想配列から表を作成してみる。
なお、行番号をカウントするために、変数 $i を使っている。

 127: /**
 128:  * HTML BODYを作成する
 129:  * @param   array $arr 超高層ビル一覧(連想配列)
 130:  * @return  string HTML BODY
 131: */
 132: function makeCommonBody6($arr) {
 133:     //一覧表作成
 134:     $table = '';
 135:     $i = 1;
 136:     foreach ($arr as $name=>$arr2) {
 137:         $table .=<<< EOD
 138: <tr>
 139: <td style="text-align:center;">{$i}</td>
 140: <td>{$name}</td>
 141: 
 142: EOD;
 143:         foreach ($arr2 as $val) {
 144:             $table ."<td>{$val}</td>\n";
 145:         }
 146:         $table ."</tr>\n";
 147:         $i++;
 148:     }
 149:     //BODY作成
 150:     $myself = MYSELF;
 151:     $refere = REFERENCE;
 152:     $title = TITLE;
 153:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 154:     $width  = WIDTH;
 155:     $debug  = '';
 156: 
 157:     //デバッグ情報
 158:     if (! FLAG_RELEASE) {
 159:         $phpver = phpversion();
 160:         $debug =<<< EOT
 161: <p>
 162: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 163: PHPver : {$phpver}
 164: 
 165: EOT;
 166:     }
 167: 
 168:     $body =<<< EOT
 169: <body>
 170: <h2>{$title} {$version}</h2>
 171: 
 172: <table class="stripe_table">
 173: <tr>
 174: <th>番号</th>
 175: <th>ビル名称</th>
 176: <th>高さ(m)</th>
 177: <th>階数</th>
 178: </tr>
 179: {$table}
 180: </table>
 181: 
 182: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 183: 参考サイト<br />
 184: <a href="{$refere}">{$refere}</a>
 185: {$debug}
 186: </div>
 187: </body>
 188: 
 189: EOT;
 190:     return $body;
 191: }

サンプル・プログラム(その7):外部ファイルからデータ読み込み

外部ファイルからデータ読み込み

配列のデータ量が多かったり、変更が多いデータの時は、外部ファイルから読み込んだりデータベースを参照するようにするとよい。

ここでは、外部テキストファイル "arr07.txt" にデータを配置する。
1行目には列名を、2行目には表示時の単位名、3行目には文字列の寄せ方を記述する。4行目以降がデータの実体である。

 116: /**
 117:  * 配列にデータを読み込む
 118:  * @param   string $fname  配列データファイル
 119:  * @param   array  $items  超高層ビル一覧を格納する配列
 120:  * @param   array  $units  単位を格納する配列
 121:  * @param   array  $aligns 文字寄せを格納する配列
 122:  * @return  array 読み込んだ配列
 123: */
 124: function readArray($fname, &$items, &$units, &$aligns) {
 125:     $infp = fopen($fname, 'r');
 126:     if ($infp == FALSE)     return FALSE;
 127: 
 128:     $columns = fgetcsv($infp, 1000, "\t");  //列名
 129:     $n = count($columns);
 130:     $arr1 = fgetcsv($infp, 1000, "\t"); //単位
 131:     $arr2 = fgetcsv($infp, 1000, "\t"); //寄せ方
 132:     for ($i = 1$i < $n$i++) {
 133:         $units[$columns[$i]]  = $arr1[$i];
 134:         $aligns[$columns[$i]] = $arr2[$i];
 135:     }
 136: 
 137:     while (! feof($infp)) {
 138:         $arr = fgetcsv($infp, 1000, "\t");
 139:         if ($arr == NULL)   break;
 140:         $n = count($arr);
 141:         for ($i = 1$i < $n$i++) {
 142:             $items[$arr[0]][$columns[$i]] = $arr[$i];
 143:         }
 144:     }
 145:     fclose($infp);
 146: 
 147:     return $items;
 148: }

ソート

オリジナルのデータの順序は住所順になっている。これを読み込んだ後に、高さの高い順に並べ替えてみる。
連想配列の添字を保持したまま、ユーザー定義の比較関数で配列をソートする組み込み関数  uasort  を利用する。

 231: uasort($items, function($a, $b) {
 232:     return ($b['高さ'- $a['高さ']);
 233: });
 234: 

参考サイト

(この項おわり)
header