繰り返し
一覧などテンプレートを繰り返す処理をやってみましょう。
一覧の作成の様子を見てみましょう
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テンプレート |