Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP菜单:父项使用哪个循环_Php_Database_Drop Down Menu_Pdo_Do While - Fatal编程技术网

PHP菜单:父项使用哪个循环

PHP菜单:父项使用哪个循环,php,database,drop-down-menu,pdo,do-while,Php,Database,Drop Down Menu,Pdo,Do While,我正在尝试使用PHP创建一个PHP菜单,它使用数据库中存储的项和PHP代码以正确的顺序构造菜单项。数据库上的值可以更改,因此我希望先导出父项,然后再添加下面的嵌套项 我想用一个循环做什么?我想从数据库中获取数据,这样我就可以正确地排列嵌套项的菜单,并用我想要使用的类输出 “我的数据库”表存储每个项的标题和url,嵌套项包含父项的id,父项的id 0设置为父项,如下所示: -------------------- | id | int(11) | -------------------

我正在尝试使用PHP创建一个PHP菜单,它使用数据库中存储的项和PHP代码以正确的顺序构造菜单项。数据库上的值可以更改,因此我希望先导出父项,然后再添加下面的嵌套项

我想用一个循环做什么?我想从数据库中获取数据,这样我就可以正确地排列嵌套项的菜单,并用我想要使用的类输出

“我的数据库”表存储每个项的标题和url,嵌套项包含父项的id,父项的id 0设置为父项,如下所示:

--------------------
| id     | int(11) |  
--------------------
| title  | varchar |  
--------------------
| url    | varchar |  
--------------------
| parent | int(11) |  
--------------------
$menu = menu::create()
    ->add('Homepage', '/', menu::create()
    ->add('Item1', '/item1/', menu::create()
        ->add('Subitem1', '/subitem1/')
        ->add('Subitem1', '/subitem1/')
    ->add('Item2', '/item2/', menu::create()
        ->add('Subitem3', '/subitem3/')
        ->add('Subitem4', '/subitem4/')
以下是我的PHP代码:

try {
    $stm = $db->prepare('SELECT * FROM menu');
    $stm->execute();
    $result = $stmt->fetchAll();

     // requested loop / function

    }
输出应如下所示:

--------------------
| id     | int(11) |  
--------------------
| title  | varchar |  
--------------------
| url    | varchar |  
--------------------
| parent | int(11) |  
--------------------
$menu = menu::create()
    ->add('Homepage', '/', menu::create()
    ->add('Item1', '/item1/', menu::create()
        ->add('Subitem1', '/subitem1/')
        ->add('Subitem1', '/subitem1/')
    ->add('Item2', '/item2/', menu::create()
        ->add('Subitem3', '/subitem3/')
        ->add('Subitem4', '/subitem4/')
请建议如何使用数据库项获取此输出。。。
多谢各位

必须要做一些调整,但我希望这会给你一个线索

function    sort_parent($parent)
{
    $j=0;
    $flag = true;
    $temp=0;
    while ( $flag )
    {
        $flag = false;
        for( $j=0;  $j < count($parent)-1; $j++)
        {
            if ($parent[$j]->id > $parent[$j+1]->id)
            {
                $temp = $parent[$j]->id;
                $parent[$j] = $parent[$j+1]->id;
                $parent[$j+1]->id = $temp;
                $flag = true;
            }
        }
    }
    return ($parent);
}

function    sort_children($children)
{
    $j=0;
    $flag = true;
    $temp=0;
    while ( $flag )
    {
        $flag = false;
        for( $j=0;  $j < count($children)-1; $j++)
        {
            if ($children[$j]->parent > $children[$j+1]->parent)
            {
                $temp = $children[$j]->parent;
                $children[$j] = $children[$j+1]->parent;
                $children[$j+1]->parent = $temp;
                $flag = true;
            }
        }
    }
    return ($children);
}

try {
    //First we fetch the parents
    $stm = $db->prepare('SELECT * FROM menu WHERE parent = 0');
    $stm->execute();
    $parent = $stmt->fetchAll();

    // Then the childrens. Note: In some versions of SQL this operator may be written as !=
    $stm = $db->prepare('SELECT * FROM menu WHERE parent <> 0');
    $stm->execute();
    $children = $stmt->fetchAll();
}

    // We sort parent and children with a basic buble sort
    $parent = sort_parent($parent);
    $children = sort_object($children);

    // To finish as Parent and Children are in the same order we can do that
    foreach ($parent as $parent_menu_item) {
        $menu = menu::create() -> add($parent_menu_item->title, $parent_menu_item->url);
        for ($j=0; $children[$i]->parent == $parent_menu_item->id; j++)
        {
            $menu = menu::create() -> add($children[$j]->title, $children[$j]->url);
        }
    }

这有帮助吗?

您可以构建一个递归查询,以按正确的顺序检索菜单项,但这取决于您的实际数据库系统。或者您可以在数据库中添加一列,以表示菜单项/、/item1、/item1/子项1'的完整路径,并使用此额外列对查询进行排序。顺便说一句,您应该添加一个order`列来对给定父项下的项目进行排序。我认为使用递归方法而不是循环会更容易