php - 从数组构建递归嵌套菜单

标签 php arrays sorting recursion

我正在尝试构建一个递归菜单,完成后看起来像这样,有无限数量的嵌套项目:

Homepage
Services
  Members
  Brokers
  Insurers
Products

我的数据通过表中一个简单的 parent_id 列链接在一​​起。

我目前已成功获取表中的所有页面,并根据其 parent_id 将它们添加到数组中(见下文)。

Array
(
    [0] => 0-0-1 0-1-2 0-2-12 0-3-27 0-4-28 0-5-29 0-6-30 0-7-31 0-8-33 
    [2] => 2-0-3 2-0-6 2-0-7 2-0-8 
    [3] => 3-0-4 3-0-5 
    [8] => 8-0-9 8-0-10 
    [12] => 12-0-13 12-0-20 
    [13] => 13-0-14 13-1-15 13-2-17 13-3-16 13-4-19 13-5-18 13-9-34 
    [20] => 20-0-21 20-1-22 20-2-24 20-3-23 20-4-26 20-5-25 20-6-11 
)

其格式为 [parent_id] => parent_id-sort_order-id parent_id-sort_order-id 等等。

到目前为止我的代码如下:

$sqlGetDropdownPages = "SELECT * FROM `cms_staticPages` ORDER BY `sortOrder` ASC";
$qryGetDropdownPages = mysql_query($sqlGetDropdownPages) or die(mysql_error());
$resGetDropdownPages = mysql_fetch_assoc($qryGetDropdownPages);
$totGetDropdownPages = mysql_num_rows($qryGetDropdownPages);

do {    

    $pageArray[$resGetDropdownPages['parent_id']] .= $resGetDropdownPages['parent_id'].'-'.$resGetDropdownPages['sortOrder'].'-'.$resGetDropdownPages['id'].' ';

} while($resGetDropdownPages = mysql_fetch_assoc($qryGetDropdownPages));

ksort($pageArray);

foreach($pageArray as $i => $value) {

    $explodePages = explode(' ',$value);

    foreach(array_filter($explodePages) as $i2 => $page) {

        $pageInfoExplode = explode('-',$page);

        $getPageInfo = mysql_fetch_assoc(mysql_query("SELECT * FROM `cms_staticPages` WHERE `id` = '".$pageInfoExplode[2]."'"));

        echo $getPageInfo['identifier'].'<br />';

    }

}

此时陷入了困境,不知道下一步该做什么。

我尽力解释这一点,因此如果需要任何澄清,请询问。

如何实现这一目标?

最佳答案

假设从数据库中提取所有菜单项后,输出如下。

$items = [
[
    'id' => '1',
    'parent_id' => '0',
    'title' => 'Menu 1',
],
[
    'id' => '2',
    'parent_id' => '0',
    'title' => 'Menu 2',
],
[
    'id' => '3',
    'parent_id' => '2',
    'title' => 'Menu 2 1',
],
[
    'id' => '4',
    'parent_id' => '0',
    'title' => 'Menu 3',
],
[
    'id' => '5',
    'parent_id' => '4',
    'title' => 'Menu 3 1',
],
[
    'id' => '6',
    'parent_id' => '5',
    'title' => 'Menu 3 1 1',
],
[
    'id' => '7',
    'parent_id' => '5',
    'title' => 'Menu 3 1 2',
],
[
    'id' => '8',
    'parent_id' => '7',
    'title' => 'Menu 3 1 2 1',
],
[
    'id' => '9',
    'parent_id' => '4',
    'title' => 'Menu 3 2',
],
[
    'id' => '10',
    'parent_id' => '0',
    'title' => 'Menu 4',
]];

我们来写一个函数来处理Array格式的数据并返回html

/**
 * Recursive and prints the elements of the given parent id.
 * @param $items
 * @param string $parentId
 */
function buildNestedItems($items, $parentId = "0", $wrapperTag = 'ul', $itemTag = 'li')
{
    // Parent items control
    $isParentItem = false;
    foreach ($items as $item) {
        if ($item['parent_id'] === $parentId) {
            $isParentItem = true;
            break;
        }
    }

    // Prepare items
    $html = "";
    if ($isParentItem) {
        $html .= "<$wrapperTag>";
        foreach ($items as $item) {
            if ($item['parent_id'] === $parentId) {
                $html .= "<$itemTag>" . $item['title'] . "</$itemTag>";
                $html .= buildNestedItems($items, $item['id']);
            }
        }
        $html .= "</$wrapperTag>";
    }
    return $html;
}

让我们打印准备好的html i页面

<div class="menu">
    <?php echo buildNestedItems($items); ?>
</div>

关于php - 从数组构建递归嵌套菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23916237/

相关文章:

java - 对两个对应的数组进行排序时出错

ios - 被 NSMutableArray sortUsingDescriptors : exception 搞糊涂了

javascript - 如何保护 JSON 响应?

php - Selenium : FirefoxProfile exception Can't load the profile. 从 PHP 调用的 Python 脚本

PHP array_replace_recursive 如果是标量,array_merge_recursive 如果是数组

php - 合并 2 个数组并合并数字键的结果

c# - 将对象转换为 byte[]

php - 看看是否过了30分钟?

PHP 没有显示任何值,但肯定会传递值

algorithm - 如何在 block 排序中对数组后缀进行排序