2011年8月 5日

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

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

<?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@xxxxx>:
> <?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@xxxxx
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2011年8月 5日 16:05
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105510
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。