簡體   English   中英

無法創建深層菜單

[英]Cannot create deep level menu

我正在嘗試創建一個深層菜單,所以我在我的數據庫中定義了這個表結構:

id | parent | menu_order
15      0         0
22     15         0
26     15         0
30     15         0
47     22         0
49     22         0
51     22         0
68     26         0
69     26         0

我試圖實現的是生成允許我正確設置menu_order列的代碼,在上面的示例中,最終結果應該是:

id | parent | menu_order
15     0          0
22     15         1
26     15         5
30     15         8
47     22         2
49     22         3
51     22         4
68     26         6
69     26         7

結果很容易理解,基本上22作為parent15 ,所以menu_order1 相同的概念適用於22的嵌套級別,即 ( 47,49,51 )。

實際上我的代碼是這樣的:

<?php

$posts = [
    ['id' => 15, 'parent' => 0, 'menu_order' => 0],
    ['id' => 22, 'parent' => 15, 'menu_order' => 0],
    ['id' => 26, 'parent' => 15, 'menu_order' => 0],
    ['id' => 30, 'parent' => 15, 'menu_order' => 0],
    ['id' => 47, 'parent' => 22, 'menu_order' => 0],
    ['id' => 49, 'parent' => 22, 'menu_order' => 0],
    ['id' => 51, 'parent' => 22, 'menu_order' => 0],
    ['id' => 68, 'parent' => 26, 'menu_order' => 0],
    ['id' => 69, 'parent' => 26, 'menu_order' => 0],
];

$currOrder = -1;

 foreach ($posts as $key => $p) {

    $currOrder++;

    $test[] = [
        'id'    => $p['id'],
        'parent' => $p['parent'],
        'menu_order' => $currOrder
    ];

    hasChild($p['id'], $currOrder, $test);
}

    
function hasChild($postId, &$currOrder, $test)
{
    // get childs post
    $childs = $this->where('parent', $postId)
        ->get()
        ->getResult();

    foreach ($childs as $c) {

        $currOrder++;
        
        $test[] = [
            'id'    => $c['id'],
            'parent' => $c['parent'],
            'menu_order' => $currOrder
        ];

         // check nested levels
        if ($c->parent != 0) {
           hasChild($c['id'], $currOrder, $test);
        }
    }
}

問題是我得到了嵌套級別的重復帖子,並且menu_order完全搞砸了。 我想我的邏輯過於復雜,有人可以幫助我實現這一目標嗎?

謝謝

有幾種方法可以處理遞歸函數。 我就是這樣做的。

<?php
// example code

$posts = [
    ['id' => 15, 'parent' => 0, 'menu_order' => 0],
    ['id' => 22, 'parent' => 15, 'menu_order' => 0],
    ['id' => 26, 'parent' => 15, 'menu_order' => 0],
    ['id' => 30, 'parent' => 15, 'menu_order' => 0],
    ['id' => 47, 'parent' => 22, 'menu_order' => 0],
    ['id' => 49, 'parent' => 22, 'menu_order' => 0],
    ['id' => 51, 'parent' => 22, 'menu_order' => 0],
    ['id' => 68, 'parent' => 26, 'menu_order' => 0],
    ['id' => 69, 'parent' => 26, 'menu_order' => 0],
];


function recursePosts($pid, $order, $tally, $posts) {
    foreach($posts as $p) {
        if ($p['parent']===$pid) {
            $p['menu_order'] = $tally  ;
            $order['id'.$p['id']] = $p;
            $tally++;
            $o = recursePosts($p['id'], $order, $tally, $posts);  
            $tally = $o[1];
            $order = $o[0];
        }
        
    }
    return [$order, $tally];
}
$o =recursePosts(0, [], 0, $posts);
$order = $o[0];
ksort($order);
print_r(array_values($order));

https://www.tehplayground.com/uNY7Bn0VyDv6JIUS

還有 PHP 原生的RecursiveIterator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM