[PHP-users 35614] Re: ツリー構造をulとli要素に変換したい

tomo tomohiko0602 @ gmail.com
2011年 8月 5日 (金) 16:05:30 JST


こんにちは!
勢いで書いたら、こんな感じに・・・

<?php
$arrWBS = array(
	"1", "1.1", "1.1.1", "1.2",
"1.2.1","1.2.1.1","1.2.1.2","1.2.1.3","1.2.1.3.1","1.2.3", "1.3",
"1.4", "1.5","1.5.1");

function getWBSHtml($arrWBS,$rootWBS){
	$i = array_search($rootWBS,$arrWBS);
	if($i === false) return;
	print "<ul>\n";
	getWBSHtml_loop($arrWBS,$i,count(explode('.',$arrWBS[$i])),1);
	print "</ul>\n";
}

function getIndent($indent){
	return str_repeat('  ',$indent);
}

function getWBSHtml_loop($arrWBS,&$i,$basenum,$indent){
	$i++;
	$countArray = count($arrWBS);
	for(;$i < $countArray;$i++){
		$num = count(explode('.',$arrWBS[$i]));
		if($basenum >= $num){
			$i--;
			return ;
		}
		print getIndent($indent)."<li>{$arrWBS[$i]}";
		if($i+1 >= $countArray){
			print "</li>\n";
			return ;
		}else{
			$nextnum = count(explode('.',$arrWBS[$i+1]));
			if($num < $nextnum){
				print "\n";
				print getIndent($indent+1)."<ul>\n";
				getWBSHtml_loop($arrWBS,$i,$num,$indent+2);
				print getIndent($indent+1)."</ul>\n";
				print getIndent($indent)."</li>\n";
			}else{
				print "</li>\n";
			}
			if($num > $nextnum){
				return ;
			}
		}
	}
}
$rootWBS = '1';
getWBSHtml($arrWBS,$rootWBS);

print str_repeat("=",35)."\n";

$rootWBS = '1.2';
getWBSHtml($arrWBS,$rootWBS);

2011年8月5日10:47 DM <fj.groups @ gmail.com>:
> <?php
>
> $arrWBS = array("1", "1.1", "1.1.1", "1.2",
> "1.2.1","1.2.1.1","1.2.1.2","1.2.1.3","1.2.1.3.1","1.2.3", "1.3", "1.4", "1.
> 5","1.5.1");
> $rootWBS = "1";
>
> のような配列(配列はソートされています)と文字列があり、
> それをもとに、
> getWBSHtml($arrWBS,$rootWBS);関数なるものをつくり、
>
> 上の例($rootWBS = "1";)だと以下のようなHTMLをはき出したいと思っています。
>
> <ul>
>        <li>1.1
>                <ul>
>                        <li>1.1.1</li>
>                </ul>
>        </li>
>        <li>1.2
>                <ul>
>                        <li>1.2.1
>                                <ul>
>                                        <li>1.2.1.1</li>
>                                        <li>1.2.1.2</li>
>                                        <li>1.2.1.3</li>
>                                        <ul>
>                                                <li>1.2.1.3.1</li>
>                                        </ul>
>
>                                </ul>
>                        </li>
>                        <li>1.2.3</li>
>                </ul>
>        <li>1.3</li>
>        <li>1.4</li>
>        <li>1.5
>                <ul>
>                        <li>1.5.1</li>
>                </ul>
>        </li>
>        </li>
> </ul>
>
> ===========================
>
> そして、
> $rootWBS = "1.2";だとすると、
>
> <ul>
>        <li>1.2.1
>                <ul>
>                        <li>1.2.1.1</li>
>                        <li>1.2.1.2</li>
>                        <li>1.2.1.3</li>
>                        <ul>
>                                <li>1.2.1.3.1</li>
>                        </ul>
>
>                </ul>
>        </li>
>        <li>1.2.3</li>
> </ul>
>
> となるHTMLをはき出したくおもっています。
> (できれば整形したかたちで)
> ===========================
>
>
> 途中まで後述のように書いたのですが、完成せず、
> また、$arrWBSを必要以上に走査して無駄な気がします。
>
> どのようにすればこういったHTMLをはき出せるのでしょうか?
> よろしくお願いします。
>
> getWBSHtml($arrWBS,$rootWBS);
> function getWBSHtml($arrWBS,$rootWBS){
>        foreach($arrWBS as $data){
>                if (preg_match("/^$rootWBS\.[^.]+$/",$data) > 0) {
>
>                        print "<ul>\n";
>                        print "<li>";
>                        print $data;
>                        getWBSHtml($arrWBS,$data);
>                        print "</li>\n";
>                        print "</ul>\n";
>                }
>
>        }
> }
>
>
> ?>
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>


PHP-users メーリングリストの案内