[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 メーリングリストの案内