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:配列の初期化

0085: // 配列の初期化 ============================================================
0086: $skyscrapers[1]  = 'あべのハルカス';
0087: $skyscrapers[2]  = '横浜ランドマークタワー';
0088: $skyscrapers[3]  = 'りんくうゲートタワービル';
0089: $skyscrapers[4]  = '大阪府咲洲庁舎';
0090: $skyscrapers[5]  = 'ミッドタウン・タワー';
0091: $skyscrapers[6]  = 'ミッドランドスクエア';
0092: $skyscrapers[7]  = 'JRセントラルタワーズオフィス棟';
0093: $skyscrapers[8]  = '東京都庁第一本庁舎';
0094: $skyscrapers[9]  = 'NTTドコモ代々木ビル';
0095: $skyscrapers[10] = 'サンシャイン60';
0096: 

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

その1:表の作成

0125: /**
0126:  * HTML BODYを作成する
0127:  * @param array $arr 超高層ビル一覧(配列)
0128:  * @return string HTML BODY
0129: */
0130: function makeCommonBody1($arr) {
0131:     //一覧表作成
0132:     $table = '';
0133:     $n = count($arr);        //配列の要素数
0134:     for ($i = 1; $i <= $n$i++) {
0135: $table .=<<< EOT
0136: <tr>
0137: <td style="text-align:center;">{$i}</td>
0138: <td>{$arr[$i]}</td>
0139: </tr>
0140: 
0141: EOT;
0142:     }
0143: 
0144:     //BODY作成
0145:     $myself = MYSELF;
0146:     $refere = REFERENCE;
0147:     $title  = TITLE;
0148:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0149:     $width  = WIDTH;
0150:     $debug  = '';
0151: 
0152:     //デバッグ情報
0153:     if (! FLAG_RELEASE) {
0154:         $phpver = phpversion();
0155: $debug =<<< EOT
0156: <p>
0157: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0158: PHPver : {$phpver}
0159: 
0160: EOT;
0161:     }
0162: 
0163: $body =<<< EOT
0164: <body>
0165: <h2>{$title} {$version}</h2>
0166: 
0167: <table class="stripe_table">
0168: <tr>
0169: <th>番号</th>
0170: <th>ビル名称</th>
0171: </tr>
0172: {$table}
0173: </table>
0174: 
0175: <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;">
0176: 参考サイト<br />
0177: <a href="{$refere}">{$refere}</a>
0178: {$debug}
0179: </div>
0180: </body>
0181: 
0182: EOT;
0183:     return $body;
0184: }

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

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

その2:配列の初期化

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

0085: // 配列の初期化 ============================================================
0086: $skyscrapers[]  = 'あべのハルカス';
0087: $skyscrapers[]  = '横浜ランドマークタワー';
0088: $skyscrapers[]  = 'りんくうゲートタワービル';
0089: $skyscrapers[]  = '大阪府咲洲庁舎';
0090: $skyscrapers[]  = 'ミッドタウン・タワー';
0091: $skyscrapers[]  = 'ミッドランドスクエア';
0092: $skyscrapers[]  = 'JRセントラルタワーズオフィス棟';
0093: $skyscrapers[]  = '東京都庁第一本庁舎';
0094: $skyscrapers[]  = 'NTTドコモ代々木ビル';
0095: $skyscrapers[] = 'サンシャイン60';
0096: 

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

その2:表の作成

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

0125: /**
0126:  * HTML BODYを作成する
0127:  * @param array $arr 超高層ビル一覧(配列)
0128:  * @return string HTML BODY
0129: */
0130: function makeCommonBody2($arr) {
0131:     //一覧表作成
0132:     $table = '';
0133:     foreach ($arr as $key=>$val) {
0134: $table .=<<< EOT
0135: <tr>
0136: <td style="text-align:center;">{$key}</td>
0137: <td>{$val}</td>
0138: </tr>
0139: 
0140: EOT;
0141:     }
0142: 
0143:     //BODY作成
0144:     $myself = MYSELF;
0145:     $refere = REFERENCE;
0146:     $title  = TITLE;
0147:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0148:     $width  = WIDTH;
0149:     $debug  = '';
0150: 
0151:     //デバッグ情報
0152:     if (! FLAG_RELEASE) {
0153:         $phpver = phpversion();
0154: $debug =<<< EOT
0155: <p>
0156: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0157: PHPver : {$phpver}
0158: 
0159: EOT;
0160:     }
0161: 
0162: $body =<<< EOT
0163: <body>
0164: <h2>{$title} {$version}</h2>
0165: 
0166: <table class="stripe_table">
0167: <tr>
0168: <th>番号</th>
0169: <th>ビル名称</th>
0170: </tr>
0171: {$table}
0172: </table>
0173: 
0174: <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;">
0175: 参考サイト<br />
0176: <a href="{$refere}">{$refere}</a>
0177: {$debug}
0178: </div>
0179: </body>
0180: 
0181: EOT;
0182:     return $body;
0183: }

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

その3:配列の初期化

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

0085: // 配列の初期化 ============================================================
0086: $skyscrapers = array(
0087: 'あべのハルカス',
0088: '横浜ランドマークタワー',
0089: 'りんくうゲートタワービル',
0090: '大阪府咲洲庁舎',
0091: 'ミッドタウン・タワー',
0092: 'ミッドランドスクエア',
0093: 'JRセントラルタワーズオフィス棟',
0094: '東京都庁第一本庁舎',
0095: 'NTTドコモ代々木ビル',
0096: 'サンシャイン60'
0097: );
0098: 

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

2次元配列とは

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

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

0085: // 配列の初期化 ============================================================
0086: $skyscrapers = array(
0087: array('あべのハルカス', '300m', '60階'),
0088: array('横浜ランドマークタワー', '295.8m', '70階'),
0089: array('りんくうゲートタワービル', '256.1m', '56階'),
0090: array('大阪府咲洲庁舎', '256.0m', '55階'),
0091: array('ミッドタウン・タワー', '248.1m', '54階'),
0092: array('ミッドランドスクエア', '246.9m', '47階'),
0093: array('JRセントラルタワーズオフィス棟', '245.0m', '51階'),
0094: array('東京都庁第一本庁舎', '242.9m', '48階'),
0095: array('NTTドコモ代々木ビル', '239.9m', '27階'),
0096: array('サンシャイン60', '239.7m', '60階')
0097: );
0098: 

その4:表の作成

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

0127: /**
0128:  * HTML BODYを作成する
0129:  * @param array $arr 超高層ビル一覧(2次元配列)
0130:  * @return string HTML BODY
0131: */
0132: function makeCommonBody4($arr) {
0133:     //一覧表作成
0134:     $table = '';
0135:     $n = count($arr);        //配列の要素数
0136:     for ($i = 0; $i < $n$i++) {
0137: $table .=<<< EOT
0138: <tr>
0139: <td style="text-align:center;">{$i}</td>
0140: <td>{$arr[$i][0]}</td>
0141: <td>{$arr[$i][1]}</td>
0142: <td>{$arr[$i][2]}</td>
0143: </tr>
0144: 
0145: EOT;
0146:     }
0147:     //BODY作成
0148:     $myself = MYSELF;
0149:     $refere = REFERENCE;
0150:     $title = TITLE;
0151:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0152:     $width  = WIDTH;
0153:     $debug  = '';
0154: 
0155:     //デバッグ情報
0156:     if (! FLAG_RELEASE) {
0157:         $phpver = phpversion();
0158: $debug =<<< EOT
0159: <p>
0160: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0161: PHPver : {$phpver}
0162: 
0163: EOT;
0164:     }
0165: 
0166: $body =<<< EOT
0167: <body>
0168: <h2>{$title} {$version}</h2>
0169: 
0170: <table class="stripe_table">
0171: <tr>
0172: <th>番号</th>
0173: <th>ビル名称</th>
0174: <th>高さ(m)</th>
0175: <th>階数</th>
0176: </tr>
0177: {$table}
0178: </table>
0179: 
0180: <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;">
0181: 参考サイト<br />
0182: <a href="{$refere}">{$refere}</a>
0183: {$debug}
0184: </div>
0185: </body>
0186: 
0187: EOT;
0188:     return $body;
0189: }

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

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

その5:表の作成

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

0127: /**
0128:  * HTML BODYを作成する
0129:  * @param array $arr 超高層ビル一覧(2次元配列)
0130:  * @return string HTML BODY
0131: */
0132: function makeCommonBody5($arr) {
0133:     //一覧表作成
0134:     $table = '';
0135:     foreach ($arr as $key1=>$arr2) {
0136:         $table .= "<tr>\n<td style=\"text-align:center;\">{$key1}</td>\n";
0137:         foreach ($arr2 as $key2=>$val) {
0138:             $table .= "<td>{$val}</td>\n";
0139:         }
0140:         $table .= "</tr>\n";
0141:     }
0142:     //BODY作成
0143:     $myself = MYSELF;
0144:     $refere = REFERENCE;
0145:     $title = TITLE;
0146:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0147:     $width  = WIDTH;
0148:     $debug  = '';
0149: 
0150:     //デバッグ情報
0151:     if (! FLAG_RELEASE) {
0152:         $phpver = phpversion();
0153: $debug =<<< EOT
0154: <p>
0155: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0156: PHPver : {$phpver}
0157: 
0158: EOT;
0159:     }
0160: 
0161: $body =<<< EOT
0162: <body>
0163: <h2>{$title} {$version}</h2>
0164: 
0165: <table class="stripe_table">
0166: <tr>
0167: <th>番号</th>
0168: <th>ビル名称</th>
0169: <th>高さ(m)</th>
0170: <th>階数</th>
0171: </tr>
0172: {$table}
0173: </table>
0174: 
0175: <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;">
0176: 参考サイト<br />
0177: <a href="{$refere}">{$refere}</a>
0178: {$debug}
0179: </div>
0180: </body>
0181: 
0182: EOT;
0183:     return $body;
0184: }

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

連想配列とは

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

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

0085: // 配列の初期化 ============================================================
0086: $skyscrapers = array(
0087: 'あべのハルカス' => array(300, 60),
0088: '横浜ランドマークタワー' => array(295.8, 70),
0089: 'りんくうゲートタワービル' => array(256.1, 56),
0090: '大阪府咲洲庁舎' => array(256.0, 55),
0091: 'ミッドタウン・タワー' => array(248.1, 54),
0092: 'ミッドランドスクエア' => array(246.9, 47),
0093: 'JRセントラルタワーズオフィス棟' => array(245.0, 51),
0094: '東京都庁第一本庁舎' => array(242.9, 48),
0095: 'NTTドコモ代々木ビル' => array(239.9, 27),
0096: 'サンシャイン60' => array(239.7, 60)
0097: );
0098: 

その5:表の作成

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

0127: /**
0128:  * HTML BODYを作成する
0129:  * @param array $arr 超高層ビル一覧(連想配列)
0130:  * @return string HTML BODY
0131: */
0132: function makeCommonBody6($arr) {
0133:     //一覧表作成
0134:     $table = '';
0135:     $i = 1;
0136:     foreach ($arr as $name=>$arr2) {
0137: $table .=<<< EOD
0138: <tr>
0139: <td style="text-align:center;">{$i}</td>
0140: <td>{$name}</td>
0141: 
0142: EOD;
0143:         foreach ($arr2 as $val) {
0144:             $table .= "<td>{$val}</td>\n";
0145:         }
0146:         $table .= "</tr>\n";
0147:         $i++;
0148:     }
0149:     //BODY作成
0150:     $myself = MYSELF;
0151:     $refere = REFERENCE;
0152:     $title = TITLE;
0153:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0154:     $width  = WIDTH;
0155:     $debug  = '';
0156: 
0157:     //デバッグ情報
0158:     if (! FLAG_RELEASE) {
0159:         $phpver = phpversion();
0160: $debug =<<< EOT
0161: <p>
0162: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0163: PHPver : {$phpver}
0164: 
0165: EOT;
0166:     }
0167: 
0168: $body =<<< EOT
0169: <body>
0170: <h2>{$title} {$version}</h2>
0171: 
0172: <table class="stripe_table">
0173: <tr>
0174: <th>番号</th>
0175: <th>ビル名称</th>
0176: <th>高さ(m)</th>
0177: <th>階数</th>
0178: </tr>
0179: {$table}
0180: </table>
0181: 
0182: <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;">
0183: 参考サイト<br />
0184: <a href="{$refere}">{$refere}</a>
0185: {$debug}
0186: </div>
0187: </body>
0188: 
0189: EOT;
0190:     return $body;
0191: }

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

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

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

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

0116: /**
0117:  * 配列にデータを読み込む
0118:  * @param string $fname  配列データファイル
0119:  * @param array  $items  超高層ビル一覧を格納する配列
0120:  * @param array  $units  単位を格納する配列
0121:  * @param array  $aligns文字寄せを格納する配列
0122:  * @return array 読み込んだ配列
0123: */
0124: function readArray($fname, &$items, &$units, &$aligns) {
0125:     $infp = fopen($fname, 'r');
0126:     if ($infp == FALSE)     return FALSE;
0127: 
0128:     $columns = fgetcsv($infp, 1000, "\t");  //列名
0129:     $n = count($columns);
0130:     $arr1 = fgetcsv($infp, 1000, "\t"); //単位
0131:     $arr2 = fgetcsv($infp, 1000, "\t"); //寄せ方
0132:     for ($i = 1; $i < $n$i++) {
0133:         $units[$columns[$i]]  = $arr1[$i];
0134:         $aligns[$columns[$i]] = $arr2[$i];
0135:     }
0136: 
0137:     while (! feof($infp)) {
0138:         $arr = fgetcsv($infp, 1000, "\t");
0139:         if ($arr == NULL)   break;
0140:         $n = count($arr);
0141:         for ($i = 1; $i < $n$i++) {
0142:             $items[$arr[0]][$columns[$i]] = $arr[$i];
0143:         }
0144:     }
0145:     fclose($infp);
0146: 
0147:     return $items;
0148: }

ソート

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

0231: uasort($itemsfunction($a$b) {
0232:     return ($b['高さ'] - $a['高さ']);
0233: });
0234: 

参考サイト

(この項おわり)
header