1

カテゴリツリーを作成するという概念を理解するのは非常に困難です。これが基準です。

  • 無制限の深さで親/子HTMLの順序付けされていないリストを作成します
  • ステータス=0のすべてのアイテムとすべての子を削除します
  • /clothes/jeansなどのURLを作成します
  • オプション:ブレッドクラムの生成

私が見つけた最も近い解決策は、それらを機能させることができなかったため、私をさらに混乱させました:

これが私の配列です:

Array
(
    [0] => Array
        (
            [id] => 1
            [parent] => 0
            [status] => 2
            [slug] => clothes
            [title] => Clothes
        )
    [1] => Array
        (
            [id] => 2
            [parent] => 1
            [status] => 2
            [slug] => jeans
            [title] => Jeans
        )
    [2] => Array
        (
            [id] => 3
            [parent] => 1
            [status] => 2
            [slug] => dresses
            [title] => Dresses
        )
    [3] => Array
        (
            [id] => 4
            [parent] => 0
            [status] => 2
            [slug] => accessories
            [title] => Accessories
        )
    [4] => Array
        (
            [id] => 5
            [parent] => 4
            [status] => 2
            [slug] => bags
            [title] => Bags
        )
    [5] => Array
        (
            [id] => 6
            [parent] => 4
            [status] => 2
            [slug] => watches
            [title] => Watches
        )
    [6] => Array
        (
            [id] => 7
            [parent] => 6
            [status] => 2
            [slug] => rolex
            [title] => Rolex
        )
)

これは私が欲しい順不同のリストです:

<ul>
    <li><a href="/clothes">Clothes</a>
        <ul>
            <li>
                <a href="/clothes/jeans">Clothes</a>
            </li>
            <li>
                <a href="/clothes/dresses">Clothes</a>
            </li>
        </ul>
    </li>
    <li><a href="/accessories">Accessories</a>
        <ul>
            <li>
                <a href="/accessories/bags">Bags</a>
            </li>
            <li>
                <a href="/accessories/watches">Watches</a>
                <ul>
                    <li>
                        <a href="/accessories/watches/rolex">Rolex</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
4

2 に答える 2

1

おそらく次のような再帰関数です。

function filter_by_parent($parent_id,$ar){
    $retval=array();
    foreach($ar as $a){
        if($a['status']==0)
            continue;
        if($a['parent']==$parent_id)
            $retval[]=$a;
    }
    return $retval;
}

function print_list($parent, $level,$ar,$url_prefix) { 
    $children = filter_by_parent($parent,$ar);
    if(empty($children))
        return;

    echo "<ul>"; 
    foreach($children as $child){ 
        // indent and display the title of this child <br>  
        echo "<li>".$child['title']. "( {$url_prefix}{$child['slug']} )";

        print_list($child['id'], $level+1,$ar,$url_prefix.$child['slug'].'/'); 
        echo  "</li>";
    } 
    echo "</ul>";
}
print_list(0,0,$test,'/');

入力すると、結果は次のようになります。

  • 服( /服 )
  • -ジーンズ( /clothes/jeans )
  • -ドレス( /clothes/dresses )
  • アクセサリー( /accessories )
  • ・バッグ( /accessories/bags )
  • -腕時計( /accessories/watches )

(これは、これの適応バージョンです:階層データをデータベースに保存する)

于 2012-11-11T13:50:57.007 に答える
0

さて、再帰関数を使用して解決策を見つけました。お急ぎの場合は、ここで完全なコードを見つけることができます。

この投稿の残りの部分は、それがどのように機能するかを説明するだけです。

これはあなたの配列です:

$arr = array
(
   0=> array
    (
         'id'  => 1,
         'parent'  => 0,
         'status'  => 2,
         'slug'  => 'clothes',
         'title'  => 'Clothes'
    ),
   1 =>array
    (
         'id'  => 2,
         'parent'  => 1,
         'status'  => 2,
         'slug'  => 'jeans',
         'title'  => 'Jeans'
    ),
   2=> array
    (
         'id'  => 3,
         'parent'  => 1,
         'status'  => 2,
         'slug'  => 'dresses',
         'title'  => 'Dresses'
    ),
    3=> array
    (
         'id'  => 4,
         'parent'  => 0,
         'status'  => 2,
         'slug'  => 'accessories',
         'title'  => 'Accessories'
    ),
    4 => array
    (
         'id'  => 5,
         'parent'  => 4,
         'status'  => 2,
         'slug'  => 'bags',
         'title'  => 'Bags'
    ),
    5 => array
    (
         'id'  => 6,
         'parent'  => 4,
         'status'  => 2,
         'slug'  => 'watches',
         'title'  => 'Watches'
    ),

    6 => array
    (
         'id'  => 7,
         'parent'  => 6,
         'status'  => 2,
         'slug'  => 'rolex',
         'title'  => 'Rolex'
    ) 

) ;

次回質問に配列を含めるときは、php スクリプトで使用する準備ができていることを確認して、人々がそれを直接操作できるようにします。

さて、最初に配列を調べて、親と子の間の接続を確立しました。私がしたことは、id1を持つ要素に子がある場合、そのすべての子が配列のインデックス1に入るということです。これが私のためにトリックを行った部分です。

$tree = array ();
foreach ($arr as $val) {
    $tree [ $val['parent'] ] [] = $val;

}

かなり単純ですよね??? :)

これは、この処理後に配列から生成される配列です。

array(4) {
  [0]=>
  array(2) {
    [0]=>
    array(5) {
      ["id"]=>
      int(1)
      ["parent"]=>
      int(0)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(7) "clothes"
      ["title"]=>
      string(7) "Clothes"
    }
    [1]=>
    array(5) {
      ["id"]=>
      int(4)
      ["parent"]=>
      int(0)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(11) "accessories"
      ["title"]=>
      string(11) "Accessories"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    array(5) {
      ["id"]=>
      int(2)
      ["parent"]=>
      int(1)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(5) "jeans"
      ["title"]=>
      string(5) "Jeans"
    }
    [1]=>
    array(5) {
      ["id"]=>
      int(3)
      ["parent"]=>
      int(1)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(7) "dresses"
      ["title"]=>
      string(7) "Dresses"
    }
  }
  [4]=>
  array(2) {
    [0]=>
    array(5) {
      ["id"]=>
      int(5)
      ["parent"]=>
      int(4)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(4) "bags"
      ["title"]=>
      string(4) "Bags"
    }
    [1]=>
    array(5) {
      ["id"]=>
      int(6)
      ["parent"]=>
      int(4)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(7) "watches"
      ["title"]=>
      string(7) "Watches"
    }
  }
  [6]=>
  array(1) {
    [0]=>
    array(5) {
      ["id"]=>
      int(7)
      ["parent"]=>
      int(6)
      ["status"]=>
      int(2)
      ["slug"]=>
      string(5) "rolex"
      ["title"]=>
      string(5) "Rolex"
    }
  }
}

さて、主要な部分がシナリオに入ります。どの子も一部の子の親になることができるため、最も簡単な解決策は再帰です。ここに再帰部分があります。

function traverser ($array ,$arr)  {


        if (! $arr)
            return;


    echo "<ul>" . "</br>";


    foreach ($arr as $var ) {
        echo "<li>" . "</br>";
        echo '<a href="/'.$var['slug'].'">'.$var['title'].'</a>';
        if (isset ($array [$var['id'] ]))
            traverser ($array , $array [$var['id'] ] ) ;

        echo "</li>";
    }


    echo "</ul>";

完全なコードはここにあります

それが役立つことを願っています。ハッピーコーディング。

于 2012-11-11T23:17:18.550 に答える