phpでul liの入れ子構造を出力する。
phpでul liの入れ子構造を出力するのは、よくやる処理なんですが、いつも新規に作って時間掛かっているので、雛形だけを記事に掲載しときます。
テストデータ
下のような入れ子構造の配列を用意します。
$data = array( 'りんご', 'ばなな', 'メロン', 'お米', array( 'コシヒカリ', array( '福井産', '新潟産', ), 'ひとめぼれ', array( '秋田産', '青森産', ), ), '麦', array( '大麦', '小麦', ), '大豆', );
phpでul liの入れ子構造を出力する関数
下の関数に上で定義した配列を渡して使います。第二引数は呼び出すときは指定しません。
print_page_tree($data);のような形で使います。
function print_page_tree($pages,$depth=0)
{
$liout = false;
$indent = str_repeat(' ', $depth);
echo "\n".$indent.'<ul>'."\n";
foreach($pages as $page) {
if (is_array($page)) {
print_page_tree($page,$depth+1);
} else {
if ($liout) {
echo '</li>'."\n";
$liout = false;
}
echo $indent.'<li>';
echo $page;
$liout = true;
}
}
if ($liout) {
echo '</li>'."\n";
}
echo $indent.'</ul>'."\n";
}
出力
print_page_tree($data);した時の出力HTML。少しインデントおかしいですが、本質的じゃないものに処理コストを掛けるのもなんなのでそのままにします。本当はインデント処理いらないかも?
<ul> <li>りんご</li> <li>ばなな</li> <li>メロン</li> <li>お米 <ul> <li>コシヒカリ <ul> <li>福井産</li> <li>新潟産</li> </ul> </li> <li>ひとめぼれ <ul> <li>秋田産</li> <li>青森産</li> </ul> </li> </ul> </li> <li>麦 <ul> <li>大麦</li> <li>小麦</li> </ul> </li> <li>大豆</li> </ul>
下のような形で表示されます。
- りんご
- ばなな
- メロン
- お米
- コシヒカリ
- 福井産
- 新潟産
- ひとめぼれ
- 秋田産
- 青森産
- コシヒカリ
- 麦
- 大麦
- 小麦
- 大豆
最後に
備忘録のようなものです。バグを発見したり、もう少し洗練されたコードに出来たらください。(おぃ
与える配列データの作成も面倒なんですけどね。。。
あわせて読む
コメント投稿