連想配列の配列をループしながら、分類項目でキーブレイクして階層的な HTML に出力したい場合、前後のタグを挟む条件分岐や最終部分の閉じタグの書き方が煩雑になりがちです。こういった処理は度々書いていますが、もう少し簡潔に書けないものかとマニュアルを読んでいたところ、current、next などの関数が使えそうでしたので試してみました。
例として、都道府県で市町村をグループ化して、セレクトボックスの HTML を出力するコードを書きました。まだ、$opt の初期化が2箇所にあるのが気に入りませんが、タグでラップする部分は分かりやすいと思います。
$dataset = array(
array('pref'=>'新潟県','city'=>'新潟市'),
array('pref'=>'新潟県','city'=>'長岡市'),
array('pref'=>'新潟県','city'=>'上越市'),
array('pref'=>'新潟県','city'=>'村上市'),
array('pref'=>'長野県','city'=>'長野市'),
array('pref'=>'長野県','city'=>'松本市'),
array('pref'=>'長野県','city'=>'上田市'),
array('pref'=>'長野県','city'=>'岡谷市'),
array('pref'=>'石川県','city'=>'金沢市'),
array('pref'=>'石川県','city'=>'七尾市'),
array('pref'=>'石川県','city'=>'小松市'),
array('pref'=>'石川県','city'=>'輪島市'),
);
$code = $opts = '';
while ($row = current($dataset)) {
$opts.= "<option>{$row['city']}</option>";
if (!($ner = next($dataset)) || $row['pref'] != $ner['pref']) {
$code.= "<optgroup label='{$row['pref']}'>{$opts}</optgroup>";
$opts = '';
}
}
echo "<select>{$code}</select>";