在中使用多维PHP数组为MySQL数据库中的每个菜单项创建友好的URL

在中使用多维PHP数组为MySQL数据库中的每个菜单项创建友好的URL,php,mysql,navigation,Php,Mysql,Navigation,MySQL导航表使用id、parent_id、name来具有无限的导航深度。我使用一个递归函数来创建多维数组,这是可行的。几个小时以来我一直在尝试创建一个函数,将路径(/mainitem/subitem/subsubsubitem/subsubsubitem/etc)放入菜单表的菜单中: $q=” 选择m.id、m.parent\u id、m.menu\u nl、parents.menu\u nl作为“parent” 从菜单中选择m 作为parents.id=m.parent\u id上的父对

MySQL导航表使用id、parent_id、name来具有无限的导航深度。我使用一个递归函数来创建多维数组,这是可行的。几个小时以来我一直在尝试创建一个函数,将路径(/mainitem/subitem/subsubsubitem/subsubsubitem/etc)放入菜单表的菜单中:

$q=” 选择m.id、m.parent\u id、m.menu\u nl、parents.menu\u nl作为“parent” 从菜单中选择m 作为parents.id=m.parent\u id上的父对象的左连接菜单 由m.parent_id ASC、m.volgorde ASC订购”

$r=$dbcon->query($q); $pages=$r->fetchAll(PDO::FETCH_ASSOC)

$tree=创建数组($pages)

var_导出如下所示:

array (
  0 => 
  array (
    'id' => 34,
    'parent_id' => 0,
    'menu_nl' => 'INTRODUCTION',
    'parent' => NULL,
  ),
  1 => 
  array (
    'id' => 36,
    'parent_id' => 0,
    'menu_nl' => 'TEAM',
    'parent' => NULL,
    'TEAM' => 
    array (
      0 => 
      array (
        'id' => 133,
        'parent_id' => 36,
        'menu_nl' => 'Team member A',
        'parent' => 'TEAM',
      ),
      1 => 
      array (
        'id' => 134,
        'parent_id' => 36,
        'menu_nl' => 'Team member B',
        'parent' => 'TEAM',
      ),
    ),
  ),
  2 => 
  array (
    'id' => 50,
    'parent_id' => 0,
    'menu_nl' => 'PRODUCTS',
    'parent' => NULL,
    'PRODUCTS' => 
    array (
      0 => 
      array (
        'id' => 151,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT A',
        'parent' => 'PRODUCTS',
        'SUB PRODUCT A' => 
        array (
          0 => 
          array (
            'id' => 154,
            'parent_id' => 151,
            'menu_nl' => 'SUB OF SUB PRODUCT A',
            'parent' => 'SUB PRODUCT A',
            'SUB OF SUB PRODUCT A' => 
            array (
              0 => 
              array (
                'id' => 156,
                'parent_id' => 154,
                'menu_nl' => 'SUB OF SUB OF SUB PRODUCT A',
                'parent' => 'SUB OF SUB PRODUCT A',
              ),
            ),
          ),
        ),
      ),
      1 => 
      array (
        'id' => 152,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT B',
        'parent' => 'PRODUCTS',
        'SUB PRODUCT B' => 
        array (
          0 => 
          array (
            'id' => 155,
            'parent_id' => 152,
            'menu_nl' => 'SUB OF SUB PRODUCTB',
            'parent' => 'SUB PRODUCT B',
          ),
        ),
      ),
      2 => 
      array (
        'id' => 153,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT C',
        'parent' => 'PRODUCTS',
      ),
    ),
  ),
  3 => 
  array (
    'id' => 40,
    'parent_id' => 0,
    'menu_nl' => 'CONTACT',
    'parent' => NULL,
    'CONTACT' => 
    array (
      0 => 
      array (
        'id' => 139,
        'parent_id' => 40,
        'menu_nl' => 'Contact form',
        'parent' => 'CONTACT',
      ),
      1 => 
      array (
        'id' => 143,
        'parent_id' => 40,
        'menu_nl' => 'How to get there',
        'parent' => 'CONTACT',
      ),
    ),
  ),
)

将元素在数组中的完整路径保存为其父元素路径与其自身路径的串联。然后将其作为递归函数中的参数向下传递


我认为这仍然有点过于抽象和宽泛。你至少能提供一些真实的数据来使用吗?试试
var\u export($array)
在这里发布一些有形的东西。而且不应该在函数中使用
返回$pad;
返回$path;
吗?你是对的,Jeff,$pad当然是返回中的$path。我已经添加了一个数组,谢谢你使用
var\u export
而不是
print\u r
这样我们就可以轻松地复制/粘贴了函数代码。我希望这能让我的代码更清晰,我希望尽可能多地使用PHP和数组,而不是SQL查询。函数应该在每次编辑或创建菜单项后创建数据库更新,这样菜单字段就可以用来查找页面ID。如果菜单字段在一次更改后更新,至少这是计划ange我还可以使用该字段创建XML格式的网站地图。但是创建网站地图不是问题。您提供了错误的输出,虽然这很有帮助,但我要求您提供您的输入。
var\u export($pages)
不是
$tree
谢谢如果您提供了缺少的部分,这将很好地工作。谢谢!递归很难让您了解,但在这种情况下是完成事情的最有效方式,在展开和循环之后,我将拥有一个完美的导航表,可以轻松地修改为多语言版本是一个网站。再次感谢!
array (
  0 => 
  array (
    'id' => 34,
    'parent_id' => 0,
    'menu_nl' => 'INTRODUCTION',
    'parent' => NULL,
  ),
  1 => 
  array (
    'id' => 36,
    'parent_id' => 0,
    'menu_nl' => 'TEAM',
    'parent' => NULL,
    'TEAM' => 
    array (
      0 => 
      array (
        'id' => 133,
        'parent_id' => 36,
        'menu_nl' => 'Team member A',
        'parent' => 'TEAM',
      ),
      1 => 
      array (
        'id' => 134,
        'parent_id' => 36,
        'menu_nl' => 'Team member B',
        'parent' => 'TEAM',
      ),
    ),
  ),
  2 => 
  array (
    'id' => 50,
    'parent_id' => 0,
    'menu_nl' => 'PRODUCTS',
    'parent' => NULL,
    'PRODUCTS' => 
    array (
      0 => 
      array (
        'id' => 151,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT A',
        'parent' => 'PRODUCTS',
        'SUB PRODUCT A' => 
        array (
          0 => 
          array (
            'id' => 154,
            'parent_id' => 151,
            'menu_nl' => 'SUB OF SUB PRODUCT A',
            'parent' => 'SUB PRODUCT A',
            'SUB OF SUB PRODUCT A' => 
            array (
              0 => 
              array (
                'id' => 156,
                'parent_id' => 154,
                'menu_nl' => 'SUB OF SUB OF SUB PRODUCT A',
                'parent' => 'SUB OF SUB PRODUCT A',
              ),
            ),
          ),
        ),
      ),
      1 => 
      array (
        'id' => 152,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT B',
        'parent' => 'PRODUCTS',
        'SUB PRODUCT B' => 
        array (
          0 => 
          array (
            'id' => 155,
            'parent_id' => 152,
            'menu_nl' => 'SUB OF SUB PRODUCTB',
            'parent' => 'SUB PRODUCT B',
          ),
        ),
      ),
      2 => 
      array (
        'id' => 153,
        'parent_id' => 50,
        'menu_nl' => 'SUB PRODUCT C',
        'parent' => 'PRODUCTS',
      ),
    ),
  ),
  3 => 
  array (
    'id' => 40,
    'parent_id' => 0,
    'menu_nl' => 'CONTACT',
    'parent' => NULL,
    'CONTACT' => 
    array (
      0 => 
      array (
        'id' => 139,
        'parent_id' => 40,
        'menu_nl' => 'Contact form',
        'parent' => 'CONTACT',
      ),
      1 => 
      array (
        'id' => 143,
        'parent_id' => 40,
        'menu_nl' => 'How to get there',
        'parent' => 'CONTACT',
      ),
    ),
  ),
)
<?php

// add $parentpath parameter
function create_array(array $elements, $parentId = 0, $parentpath = '') {

    $branch = array();

    foreach ($elements as $element) {
        // set the fullpath from parent concatenated to this menu_nl
        $element['fullpath'] = "$parentpath/$element[menu_nl]";

        if ($element['parent_id'] == $parentId) {

            // pass the fullpath down to its children
            $children = create_array($elements, $element['id'], $element['fullpath']);

            if ($children) {
                $element[$element['menu_nl']] = $children;
            }

            $branch[] = $element;
        }
    }

    return $branch;
}

$pages = require 'pages.php';

print_r( create_array($pages) );
Array
(
    [0] => Array
        (
            [id] => 34
            [parent_id] => 0
            [menu_nl] => INTRODUCTION
            [parent] => 
            [fullpath] => /INTRODUCTION
        )

    [1] => Array
        (
            [id] => 36
            [parent_id] => 0
            [menu_nl] => TEAM
            [parent] => 
            [fullpath] => /TEAM
            [TEAM] => Array
                (
                    [0] => Array
                        (
                            [id] => 133
                            [parent_id] => 36
                            [menu_nl] => Team member A
                            [parent] => TEAM
                            [fullpath] => /TEAM/Team member A
                        )

                    [1] => Array
                        (
                            [id] => 134
                            [parent_id] => 36
                            [menu_nl] => Team member B
                            [parent] => TEAM
                            [fullpath] => /TEAM/Team member B
                        )

                )

        )

    [2] => Array
        (
            [id] => 50
            [parent_id] => 0
            [menu_nl] => PRODUCTS
            [parent] => 
            [fullpath] => /PRODUCTS
            [PRODUCTS] => Array
                (
                    [0] => Array
                        (
                            [id] => 151
                            [parent_id] => 50
                            [menu_nl] => SUB PRODUCT A
                            [parent] => PRODUCTS
                            [fullpath] => /PRODUCTS/SUB PRODUCT A
                            [SUB PRODUCT A] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 154
                                            [parent_id] => 151
                                            [menu_nl] => SUB OF SUB PRODUCT A
                                            [parent] => SUB PRODUCT A
                                            [fullpath] => /PRODUCTS/SUB PRODUCT A/SUB OF SUB PRODUCT A
                                            [SUB OF SUB PRODUCT A] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 156
                                                            [parent_id] => 154
                                                            [menu_nl] => SUB OF SUB OF SUB PRODUCT A
                                                            [parent] => SUB OF SUB PRODUCT A
                                                            [fullpath] => /PRODUCTS/SUB PRODUCT A/SUB OF SUB PRODUCT A/SUB OF SUB OF SUB PRODUCT A
                                                        )

                                                )

                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 152
                            [parent_id] => 50
                            [menu_nl] => SUB PRODUCT B
                            [parent] => PRODUCTS
                            [fullpath] => /PRODUCTS/SUB PRODUCT B
                            [SUB PRODUCT B] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 155
                                            [parent_id] => 152
                                            [menu_nl] => SUB OF SUB PRODUCTB
                                            [parent] => SUB PRODUCT B
                                            [fullpath] => /PRODUCTS/SUB PRODUCT B/SUB OF SUB PRODUCTB
                                        )

                                )

                        )

                    [2] => Array
                        (
                            [id] => 153
                            [parent_id] => 50
                            [menu_nl] => SUB PRODUCT C
                            [parent] => PRODUCTS
                            [fullpath] => /PRODUCTS/SUB PRODUCT C
                        )

                )

        )

    [3] => Array
        (
            [id] => 40
            [parent_id] => 0
            [menu_nl] => CONTACT
            [parent] => 
            [fullpath] => /CONTACT
            [CONTACT] => Array
                (
                    [0] => Array
                        (
                            [id] => 139
                            [parent_id] => 40
                            [menu_nl] => Contact form
                            [parent] => CONTACT
                            [fullpath] => /CONTACT/Contact form
                        )

                    [1] => Array
                        (
                            [id] => 143
                            [parent_id] => 40
                            [menu_nl] => How to get there
                            [parent] => CONTACT
                            [fullpath] => /CONTACT/How to get there
                        )

                )

        )

)