-1

私のデータベース(サイトマップ)の完全なツリーを生成する際に問題があります。
より良いコードを書きたいというレベルに達しました。それが、このパズルに再帰関数を選択する理由です。

無限の順序なしリストを生成したい。そのようです:

<ul>
 <li><a></a>
  <ul>
    <li><a></a>(subs)
    etc etc etc.....
  </ul>
 </li>
</ul>

すでに言ったように、次のことを試しました:

<?php
    function traverseArray($array, $sub=false)
    { 
        foreach($array as $cat)
        {
            if(isset($cat['childeren']) && is_array($cat['childeren']))
            {
                //a category with subs
                echo('<ul id="'.$cat['parent_cat_id'].'" class="lv0">');
                    echo('<li id="'.$cat['parent_cat_id'].'"><a href=#>'.$cat['name'].'</a>'."\n");
                traverseArray($cat['childeren'], true);
            }else{
                if($sub){
                    //a sub category of category
                    echo('</ul></li>');
                    echo('<li id="'.$cat['parent_cat_id'].'"><a href=#>'.$cat['name'].'</a></li>'."\n");                
                }else{
                    //category with no subs
                    echo('<ul id="'.$cat['parent_cat_id'].'" class="lv0">');            
                        echo('<li id="'.$cat['parent_cat_id'].'"><a href=#>'.$cat['name'].'</a></li>'."\n");
                    echo('</ul>');
                }
            }
        }
    }
    traverseArray($sitemap);
?>

しかし、これは私が正しく理解できないパズルです。これはこれまでの結果です(乱雑):

<ul id="0" class="lv0">
   <li id="0"><a href=#>Headsets</a>
</ul></li>

<li id="1"><a href=#>(USB) headsets ....</a></li>
</ul></li>
<li id="1"><a href=#>... headsets</a></li>
</ul></li>
<li id="1"><a href=#>.. USB headsets</a></li>
</ul></li>
<li id="1"><a href=#>Bluetooth headsets</a></li>
<ul id="0" class="lv0">
   <li id="0"><a href=#>Unified Communications</a></li>

大混乱!$sitemap 配列は次のようになります。

Array
(
    [0] => Array
        (
            [category_id] => 1
            [parent_cat_id] => 0
            ..........etc
            ........etc
            [type] => cat
            [childeren] => Array
                (
                    [0] => Array
                        (
                            [category_id] => 2
                            [parent_cat_id] => 1
                            .......etc
                            [type] => cat
                            [childeren] => Array
                                (
                                    [0] => Array
                                        (
                                            [category_id] => 32
                                            [parent_cat_id] => 16
                                            .......etc
                                            [type] => series
                                        )                            
                        )

それで、子供たち、子供たち、子供たち、これはこれを行うための最良の方法ですか/正しい軌道に乗っていますか?

それとももっと良い方法がありますか?SQLツリーか何かのように?または、foreach の古い foreach ..(今回は回避しようとしています)。

どんな助けでも大歓迎です!!!

前もって感謝します、

ジェイコブ

4

1 に答える 1

0

「私のコードの何が問題なのですか?」スタックオーバーフローの問題ではありません。

「traverseArray」関数が何をすべきかを考えてください。あなたのコードは混乱しています。これは、配列トラバースのきれいな例です。あなたのニーズに合わせてください:

function traverseArray($array)
{
    echo '<ul>';
    foreach($array as $cat)
    {
        echo '<li>';
        if(isset($cat['childeren']) && is_array($cat['childeren']))
        {
            echo '<a href="#">' . $cat['name'] . '</a>';
            traverseArray($cat['childeren']);
        }
        else
        {
            echo '<a href="' . $cat['url'] . '">' . $cat['name'] . '</a>';
        }
        echo '</li>';
    }
    echo '</ul>';
}

traverseArray($sitemap);
于 2013-01-23T16:35:20.427 に答える