0

PHPで生成されたHTMLを使用してjQueryドロップダウンメニューを作成するメニューがあります。メニューの作成に使用される情報は、カテゴリのデータベース テーブルから取得されます。

ネコ(データベーステーブル)

cat_id | 猫の名前 | 猫の親| cat_short
__________________________________________
1 | ホーム | 0 | 家
__________________________________________
2 | ゲーム | ゲーム | 1 | ゲーム
__________________________________________
3 | チェッカー | 2 | チェッカーズ

これまでに作成したコードでは、メニューで 2 つのレベルしか使用できず、3 番目のレベル (つまり、チェッカー) の別のドロップダウンを追加しません。

<ul class="dropdown">
    <?php
    $sql ='SELECT * FROM cats WHERE cat_parent = 0';
    $result = $db->sql_query($sql);
    while($row = $db->sql_fetchrow($result)){
        $cats[] = array(
            'id' => $row['cat_id'],
            'name' => $row['cat_name'],
            'parent' => $row['cat_parent'],
            'short' => $row['cat_short'],
            'subs' => array()
        );
    }

    foreach($cats as $cat){
        $sql = 'SELECT * FROM cats WHERE cat_parent = '.$cat['id'];
        $result = $db->sql_query($sql);
        while($row = $db->sql_fetchrow($result)){
            $cat['subs'][] = array(
                'id' => $row['cat_id'],
                'name' => $row['cat_name'],
                'parent' => $row['cat_parent'],
                'short' => $row['cat_short']
            );
        }
        $menu[] = $cat;
    }

    foreach($menu as $cat){ ?>
        <li class="ui-state-default"><a class="transition" href="index.php?mode=<?php echo $cat['short']; ?>"><?php echo $cat['name']; ?></a>
        <?php if($cat['subs'] != '0'){ ?>
            <ul class="sub_menu">
            <?php foreach($cat['subs'] as $sub){ ?>
                <li class="ui-state-default"><a class="transition" href="index.php?mode=<?php echo $sub['short']; ?>"><?php echo $sub['name']; ?></a></li>
            <?php } ?>
            </ul>
        <?php } ?>
        </li>
    <?php } ?>
</ul>

3つのレイヤーを利用できるようにするには、どうすればこれを書き直す(または関数を書く)ことができますか? jquery を使用してリスト項目要素を簡単に操作して実際のドロップダウンを実行できるため、必要な PHP ループのみが必要です。

4

1 に答える 1

0

次のコード(テストされていない、申し訳ありません)は、任意の数のレベルでトリックを実行できます。

<?php
# a key-value list of all cats by their IDs:
$all_cats = array();

# the final list of cats we want:
$cats = array();

$sql ='SELECT * FROM cats';
$result = $db->sql_query($sql);

# fetch all cats
while($row = $db->sql_fetchrow($result)){
    $all_cats[$row['cat_id']] = array(
        'id' => $row['cat_id'],
        'name' => $row['cat_name'],
        'parent' => $row['cat_parent'],
        'short' => $row['cat_short'],
        'subs' => array()
    );
}

# group cats by parent (note reference & to $cat) - we are dealing with the same object
foreach ($all_cats as $id => &$cat) {
    $parent = $cat['cat_parent'];
    if ($parent == 0) {
        $cats[] = $cat;
    } else {
        $all_cats[$parent]['subs'][] = $cat;
    }
}

最後に、適切$catsに満たされた第1レベルの猫の配列が含まれます。subs

テーブルが大きくなりすぎると、大量のメモリが必要になりますが、少なくともデータベースにアクセスするのは1回だけであることに注意してください。

于 2012-11-22T17:38:08.533 に答える