【问题标题】:How to LOOP into this query in PHP?如何在 PHP 中循环进入这个查询?
【发布时间】:2015-02-01 04:44:41
【问题描述】:

我正在创建一个新网站,但我正在努力解决菜单问题。一些元素(父元素:0)没有子元素,而另一些元素有 1 或 2。我正在尝试一种新方法来让事情变得更短、更安全、更容易,但我遇到了一些问题。这是我的代码:

我的问题是,在 FOR LOOP 中,我确实正确地获得了子菜单项的数量,但显然“标签”与父级相同,因为这是循环中已经存在的 ARRAY 键。这个想法的原作者http://wizardinternetsolutions.com/articles/web-programming/dynamic-multilevel-css-menu-php-mysql 用 $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 浏览
  • 关于我们

我得到了:

  • 首页
  • 浏览目录
  • ----- 浏览目录
  • ----- 浏览目录
  • 关于我们

【问题讨论】:

  • 问题不清楚。请显示您的数据,显示您的 html 输出真实和预期

标签: php loops for-loop while-loop


【解决方案1】:

NVM 我找到了解决方案。我在 menu 表中添加了一个名为 position 的新列(如果是主菜单,则为 0,如果是子菜单,则为 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 以便能够回显新的菜单级别。

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 2014-09-29
    • 2017-06-01
    • 2012-04-30
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多