如何在PHP中循环到该查询中?

如何在PHP中循环到该查询中?,php,loops,for-loop,while-loop,Php,Loops,For Loop,While Loop,我正在创建一个新网站,我正在努力与菜单。父元素0中的某些元素没有子元素,而另一些元素有1或2。我正在尝试一种新的方法,使事情变得更短、更安全、更简单,但我在做一些事情。这是我的密码: 我的问题是,在FOR循环中,我确实正确地获得了子菜单otem的数量,但显然“label”与父菜单otem相同,因为它是循环中已经存在的数组键。这一想法的最初作者用$label+1修复了它,但我不会再次执行SQL搜索。我该怎么办 更新:以下是涉及该函数的完整代码: public function sQuery() {

我正在创建一个新网站,我正在努力与菜单。父元素0中的某些元素没有子元素,而另一些元素有1或2。我正在尝试一种新的方法,使事情变得更短、更安全、更简单,但我在做一些事情。这是我的密码:

我的问题是,在FOR循环中,我确实正确地获得了子菜单otem的数量,但显然“label”与父菜单otem相同,因为它是循环中已经存在的数组键。这一想法的最初作者用$label+1修复了它,但我不会再次执行SQL搜索。我该怎么办

更新:以下是涉及该函数的完整代码:

public function sQuery() {
$sql = "SELECT a.id, a.label, a.link, Deriv1.Count
    FROM `menu` a
    LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1
    ON a.id = Deriv1.parent
    WHERE a.parent = :parent";

try {
    $core = Core::getInstance();
    $stmt = $core->dbh->prepare($sql);
    $stmt->bindParam(':parent', $this->_mParent, PDO::PARAM_INT);

    if ($stmt->execute()) {
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        while ($menuItem = $stmt->fetch()) {
            echo "<li class=\"dropdown\">\r\n";
            echo "<a href=\"".$menuItem['link']."\" class=\"dropdown-toggle js-activated\">".$menuItem['label']."</a>\r\n";

            if ($menuItem['Count'] > 0) {                           
                echo "<ul class=\"dropdown-menu\">\r\n";}

                // THIS IS THE PART THAT DOESN'T GET ME THE CORRECT INFO
                for ($i = 1; $i <= $menuItem['Count']; $i++) {
                    echo "<li><a href=\"".$menuItem['link']."\">".$menuItem['label']."</a></li>\r\n";
                }

                echo "</ul>\r\n";
            }

            echo "</li><!-- /.dropdown -->\r\n";
        }
    }
}
catch(PDOException $e)
{
    echo "Connection failed: " . $e->getMessage();
}
}

结果应该是:

家 浏览目录 ---按类别浏览 ---按ID浏览 关于我们 我得到:

家 浏览目录 ---浏览目录 ---浏览目录 关于我们
我找到了解决办法。我在菜单表中添加了一个新列,如果它是主菜单,则称为position 0;如果它是子菜单,则称为position 1,等等,并从查询中构建了一个完整的数组,然后根据每行的位置将其拆分为3个新数组:

<?
$sql = "SELECT a.id, a.label, a.link, a.parent, a.position, Deriv1.Count
    FROM `menu` a
    LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1
    ON a.id = Deriv1.parent";

try
{

    $core = Core::getInstance();
    $stmt = $core->dbh->prepare($sql);
    $stmt->bindParam(':parent', $this->_mParent, PDO::PARAM_INT);

    if ($stmt->execute()) {

        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        echo "\r\n";

        // Return a full array
        while ($menuItem = $stmt->fetch()) {
            $this->_aFull[] = array(
                'id' => $menuItem['id'],
                'label' => $menuItem['label'],
                'link' => $menuItem['link'],
                'parent' => $menuItem['parent'],
                'position' => $menuItem['position'],
                'Count' => $menuItem['Count'],
                );
        }

        // Return 3 arrays - 1 for each type of menu level
        foreach ($this->_aFull as $value) {
            if ($value['position'] == 0) {
                $this->_aLevel0[] = array(
                    'id' => $value['id'],
                    'label' => $value['label'],
                    'link' => $value['link'],
                    'parent' => $value['parent'],
                    'Count' => $value['Count'],
                    );
            }
            elseif ($value['position'] == 1) {
                $this->_aLevel1[] = array(
                    'id' => $value['id'],
                    'label' => $value['label'],
                    'link' => $value['link'],
                    'parent' => $value['parent'],
                    'Count' => $value['Count'],
                    );
            }
            elseif ($value['position'] == 2) {
                $this->_aLevel2[] = array(
                    'id' => $value['id'],
                    'label' => $value['label'],
                    'link' => $value['link'],
                    'parent' => $value['parent'],
                    'Count' => $value['Count'],
                    );
            }

        }

        // Evaluate the first level array (Array0) and echo the menu
        foreach ($this->_aLevel0 as $key => $value) {

            echo "<li class=\"dropdown\">\r\n";
            echo "<a href=\"".$value['link']."\" class=\"dropdown-toggle js-activated\">".$value['label']."</a>\r\n";

            // Evaluate the `Count` key of the array to see if the row being parsed has children
            if ($value['Count'] > 0) {

                echo "<ul class=\"dropdown-menu\">\r\n";

                // For each children, echo the sub-menu
                foreach ($this->_aLevel1 as $a => $b) {
                    if ($b['parent'] == $value['id']) {
                        echo "<li><a href=\"".$value['link']."/".$b['link']."\">".$b['label']."</a></li>\r\n";
                    }
                }

                echo "</ul>\r\n";
            }

            echo "</li><!-- /.dropdown -->\r\n";
        }
    }
}
catch(PDOException $e)
{
    echo "Connection failed: " . $e->getMessage();
}
?>
我相信这不是最简单也不是最漂亮的解决方案,但至少它可以工作,并且只对数据库进行一次查询,因此在生产环境中应该非常快


我留下了第三个数组,以防我的菜单中需要第三个级别。我所要做的就是在查询中添加另一个计数器和另一对IF/FOREACH,以便能够响应新的菜单级别。

问题不清楚。请显示您的数据,真实地显示您的html输出