こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PHPでHTML文字列を作成して変数に格納する方法とob_start関数を使って、PHPの変数に格納する方法について解説していきます。
目次
PHPでHTMLを作成して、PHPの変数に格納する方法
PHPでHTMLを作成して、PHPの変数に格納する方法として、2つの方法を紹介していきます。
PHPで動的に加工処理とHTML文字列を結合しながら変数に格納する方法
最初に紹介するのは、必要なデータをPHPで動的に組み込みながらHTMLを文字列として、結合しながら作成する方法です。
SampleCodeでは、SelectBoxを動的に作成しています。
<?php
$data_set = [
(object)['group' => '日本', 'city' => '東京'],
(object)['group' => '日本', 'city' => '大阪'],
(object)['group' => 'ドイツ', 'city' => 'ベルリン'],
(object)['group' => 'ドイツ', 'city' => 'ミュンヘン'],
(object)['group' => 'アメリカ', 'city' => 'ニューヨーク'],
(object)['group' => 'アメリカ', 'city' => 'ロサンゼルス'],
];
$group_array = [];
$city_info = [];
foreach ($data_set as $data) {
$group_name = $data->group;
// group_arrayにグループ名が登録されていなければ、グループ名を登録する
if (!in_array($group_name, $group_array)) array_push($group_array, $group_name);
// グループ名リストから、key(index)を取得する
$group_key = array_search($group_name, $group_array);
$city_obj = (object)[];
$city_obj->city = $data->city;
$city_obj->group_key = $group_key;
array_push($city_info, $city_obj);
}
// 1. 動的に加工処理とHTML文字列を結合しながら変数に格納する
$select_box = '<select id="world-city">';
// グループ分けされたSelectBoxを作成する
foreach ($group_array as $key => $group) {
$select_box .= "<optgroup label='{$group}'>";
foreach ($city_info as $city_obj) {
if ($city_obj->group_key == $key) {
$select_box .= "<option>{$city_obj->city}</option>";
}
}
$select_box .= '</optgroup>';
}
$select_box .= '</select>';
echo $select_box;
// [ 実行結果 ]
// <select id="world-city">
// <optgroup label='日本'>
// <option>東京</option>
// <option>大阪</option>
// </optgroup>
// <optgroup label='ドイツ'>
// <option>ベルリン</option>
// <option>ミュンヘン</option>
// </optgroup>
// <optgroup label='アメリカ'>
// <option>ニューヨーク</option>
// <option>ロサンゼルス</option>
// </optgroup>
// </select>
ob_start関数を使って、HTMLをバッファーデータとして変数に格納する
先述のPHPで動的に加工処理とHTML文字列を結合しながら変数に格納する方法は、
HTMLを文字列として扱いながら組み立て・結合していくという作業が面倒にも思えます。
ob_start関数を使って、HTMLをバッファーデータとして変数に格納して、出力する方法もあります。
ちなみに、obとは、output buffering(出力バッファリング)の略です。
<?php
$data_set = [
(object)['group' => '日本', 'city' => '東京'],
(object)['group' => '日本', 'city' => '大阪'],
(object)['group' => 'ドイツ', 'city' => 'ベルリン'],
(object)['group' => 'ドイツ', 'city' => 'ミュンヘン'],
(object)['group' => 'アメリカ', 'city' => 'ニューヨーク'],
(object)['group' => 'アメリカ', 'city' => 'ロサンゼルス'],
];
$group_array = [];
$city_info = [];
foreach ($data_set as $data) {
$group_name = $data->group;
// group_arrayにグループ名が登録されていなければ、グループ名を登録する
if (!in_array($group_name, $group_array)) array_push($group_array, $group_name);
// グループ名リストから、key(index)を取得する
$group_key = array_search($group_name, $group_array);
$city_obj = (object)[];
$city_obj->city = $data->city;
$city_obj->group_key = $group_key;
array_push($city_info, $city_obj);
}
// 1. HTMLをバッファーデータとして取得し始める
ob_start();
?>
<select id="world-city" multiple>
<?php
// グループ分けされたSelectBoxを作成する
foreach ($group_array as $key => $group) { ?>
<optgroup label="<?php echo $group ?>">
<?php
foreach ($city_info as $city_obj) {
if ($city_obj->group_key == $key) { ?>
<option><?php echo $city_obj->city ?></option>
<?php
}
}
?>
</optgroup> <?php
} ?>
</select>
<?php
// 2. 出力のバッファを開始する
$select_box = ob_get_contents();
// 3. バッファーデータをクリーンナップする
ob_end_clean();
echo $select_box;
// [ 実行結果 ]
// <select id="world-city" multiple>
// <optgroup label="日本">
// <option>東京</option>
// <option>大阪</option>
// </optgroup>
// <optgroup label="ドイツ">
// <option>ベルリン</option>
// <option>ミュンヘン</option>
// </optgroup>
// <optgroup label="アメリカ">
// <option>ニューヨーク</option>
// <option>ロサンゼルス</option>
// </optgroup>
// </select>
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!