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>

下のような形で表示されます。

  • りんご
  • ばなな
  • メロン
  • お米
    • コシヒカリ
      • 福井産
      • 新潟産
    • ひとめぼれ
      • 秋田産
      • 青森産
    • 大麦
    • 小麦
  • 大豆

最後に

備忘録のようなものです。バグを発見したり、もう少し洗練されたコードに出来たらください。(おぃ

与える配列データの作成も面倒なんですけどね。。。

ページトップ

ブックマーク!


コメント投稿

* は必須項目です。入力したメールアドレスは公開されません。

*
*



AccessやExcel、.NETソフトウェア開発、WordPress等を使用したWebのシステム化、PCサポート、コンサルなどを行っています。全国対応可能です。お問い合わせください。
TEL (0776)56-8539