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