繰り返し
一覧などテンプレートを繰り返す処理をやってみましょう。
一覧の作成の様子を見てみましょう
| list.php | list.htm | |
<?php
// テンプレートの読み込み
$html = file_get_contents("list.htm");
// テンプレートの文字コード変換
$to_encoding = mb_internal_encoding();
$html = mb_convert_encoding($html, $to_encoding, "auto");
// データ
$datalist = array(
0 => array("name" => "りんご", "price" => 1230, "remark" => "ふじ 青森県産"),
1 => array("name" => "みかん", "price" => 980, "remark" => "有田 和歌山県産"),
2 => array("name" => "なし", "price" => 1380, "remark" => "幸水 山口県産")
);
// 一覧テンプレートの取得
$block = "<!--ROW-->";
preg_match("/".$block."(.*?)".$block."/s", $html, $matches);
$row_template = ltrim($matches[1], "\r\n");
// 一覧の作成(データの繰り返し)
foreach ($datalist as $data) {
// 1行のテンプレートを初期化
$row = $row_template;
// テンプレート文字の置換
$row = str_replace("{data.name}", htmlspecialchars($data['name']), $row);
$row = str_replace("{data.price.number}", number_format($data['price']), $row);
$row = str_replace("{data.remark}", htmlspecialchars($data['remark']), $row);
// 1行を行全体に追加
$rows .= $row;
}
// 一覧の行全体をテンプレート全体に反映
$html = preg_replace("/".$block."(.*?)".$block."/s", $rows, $html);
// テンプレートの出力
print $html;
?>
|
<html> <head> <title>一覧表示</title> </head> <body> <table border="1"> <tr> <th>品名</th> <th>価格</th> <th>備考</th> </tr> <!--ROW--> <tr> <td>{data.name}</td> <td align="right">{data.price.number}</td> <td>{data.remark}</td> </tr> <!--ROW--> </table> </body> </html> |
一覧の作成の様子を見てみましょう
| 一覧テンプレートの <!--ROW-->で囲まれたブロックを取得します | $row_template | |||||||||||||
// 一覧テンプレートの取得
$block = "<!--ROW-->";
preg_match("/".$block."(.*?)".$block."/s", $html, $matches);
$row_template = ltrim($matches[1], "\r\n");
|
<tr> <td>{data.name}</td> <td align="right">{data.price.number}</td> <td>{data.remark}</td> </tr> |
|||||||||||||
| 1行のデータの置換 | $row | |||||||||||||
// 1行のテンプレートを初期化
$row = $row_template;
// テンプレート文字の置換
$row = str_replace("{data.name}", htmlspecialchars($data['name']), $row);
$row = str_replace("{data.price.number}", number_format($data['price']), $row);
$row = str_replace("{data.remark}", htmlspecialchars($data['remark']), $row);
|
<tr> <td>りんご</td> <td align="right">1,230</td> <td>ふじ 青森県産</td> </tr> |
|||||||||||||
| 2巡目の1行のデータの置換 | $rows | |||||||||||||
// 1行のテンプレートを初期化
$row = $row_template;
// テンプレート文字の置換
$row = str_replace("{data.name}", htmlspecialchars($data['name']), $row);
$row = str_replace("{data.price.number}", number_format($data['price']), $row);
$row = str_replace("{data.remark}", htmlspecialchars($data['remark']), $row);
// 1行を行全体に追加
$rows .= $row;
|
<tr> <td>りんご</td> <td align="right">1,230</td> <td>ふじ 青森県産</td> </tr> <tr> <td>みかん</td> <td align="right">980</td> <td>有田 和歌山県産</td> </tr> |
|||||||||||||
| テンプレートの <!--ROW--> で囲まれた部分を組み立てた行全体で置き換えます | $html | |||||||||||||
// 一覧の行全体をテンプレート全体に反映
$html = preg_replace("/".$block."(.*?)".$block."/s", $rows, $html);
|
<html> <head> <title>一覧表示</title> </head> <body> <table border="1"> <tr> <th>品名</th> <th>価格</th> <th>備考</th> </tr> <tr> <td>りんご</td> <td align="right">1,230</td> <td>ふじ 青森県産</td> </tr> <tr> <td>みかん</td> <td align="right">980</td> <td>有田 和歌山県産</td> </tr> <tr> <td>なし</td> <td align="right">1,380</td> <td>幸水 山口県産</td> </tr> </table> </body> </html> |
|||||||||||||
| 出力 | wwwブラウザ | |||||||||||||
// テンプレートの出力 print $html; |
|
| 戻る フォーマット | HTMLテンプレート |