-1

我正在尝试创建一个按菜单类型 (div_id) 和项目类型 (grp_id) 划分的菜单页面,并显示项目信息:标题、描述、价格等。虽然每个 grp_id 都应该在它是自己的 html 表(例如,“啤酒 - 瓶装”所有项目列在一张表中,“啤酒 - 草案”在另一张表中)。此外,每个菜单(例如 Beverages、Salads 等)都应该在一个单独的手风琴窗口中:

饮料

啤酒 - 瓶装

Killian's : $4.75
Molson : $4.75
Peroni : $6.00

啤酒 - 草案

吉尼斯:5.50 美元

酒红色的

Banfi,“Colle di Sasso”,意大利:15.75 美元
Bell'agio,基安蒂,意大利:16.95 美元

酒 - 白

Beringer,莫斯卡托,加利福尼亚:14.95 美元
普拉西多,灰比诺,意大利:14.95 美元

沙拉

开胃菜沙拉:$6.25
烤鸡肉沙拉:$7.95
Mesclun Side Salad:$4.95

等等...

数据在 MYSQL 表中:

列类型 Null 默认值

menu_id int(10) 否
div_id int(10) 否
grp_id int(10) 是 NULL
cat_id int(10) 是 NULL
date_b date 否
date_e date 否
price float(6,2) 是 NULL
price2 float(6,2) 是 NULL
price3 float(6,2) 是 NULL
title varchar(255) 否
descr text 是 NULL
特殊 enum('n', 'y') 否 n
ordr int(4) 否 10

div_id、grp_id 和 cat_id 是外键,其表包含菜单类型 (div_id)(div_name) 和项目类型 (grp_id)(grp_name)。

为了做到这一点,我已经像这样查询了数据库:

$query_listMenu = sprintf("SELECT menu.menu_id, menu.div_id, m_div.div_name, menu.grp_id, m_grp.grp_name, menu.cat_id, m_cat.cat_name, m_cat.cat_ord, menu.title, menu.descr, menu.price, menu.price2, menu.price3, menu.date_b, menu.date_e
FROM menu
LEFT JOIN m_div ON ( menu.div_id = m_div.div_id )
LEFT JOIN m_grp ON ( menu.grp_id = m_grp.grp_id )
LEFT JOIN m_cat ON ( menu.cat_id = m_cat.cat_id )
WHERE menu.date_e >= NOW() 
ORDER BY m_div.div_name, ordr, m_grp.grp_name, menu.title");

将结果转储到多维数组中$menuRows

$listMenu = mysql_query($query_listMenu, $siteuser);
while ( $row = mysql_fetch_array($listMenu, MYSQL_ASSOC) )
{
$menuRows[] = $row;
}

这是我用来遍历数组并显示内容的代码,但它无法正常工作:

foreach ($menuRows as $section => $type) {
echo "<h3>" . $type['div_name'] . "</h3>";
echo "<table>";
echo "<tr><th>" . $type['grp_name'] . "</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr>";
foreach ($menuRows as $menu => $item) {
    if ($item['div_name'] == $type['div_name']) {
        echo "<tr><td><strong>" . $item['title'] . "</strong>" . $item['descr'] . "</td><td>" . $item['price'] . "</td><td>" . $item['price2'] . "</td><td>" . $item['price3'] . "</td></tr>"; 
}
} echo '</table>';
}

问题是每个菜单的重复次数与类别中的项目一样多。例如,饮料有 8 个项目,因此饮料部分重复 8 次。每个类别条目的重复次数等于该类别中的项目数。这显然是嵌套 foreach 函数的结果,但我无法找出正确的代码。

此外,显示的代码不会根据 grp_name 进行过滤,因此所有饮料都以一个 html 表格结束,啤酒和葡萄酒。虽然 Wine - red 将有自己的桌子,就像 Beer - Draft 一样,但所有饮料都会在每个桌子上重复。

任何帮助将非常感激。

4

1 回答 1

0

如果您想像这样对行进行分段,则需要按照您的意愿创建数组,而不仅仅是将数据转储到其中。例如,为了让您开始,这就是您创建项目的方式:

while ( $row = mysql_fetch_array($listMenu, MYSQL_ASSOC) )
{
    $item = array('title'=>$row['title'],'descr'=>$row['descr'],'price'=>$row['price'],'price2'=>$row['price2'],'price3'=>$row['price3']);

    $menuRows[$row['div_name']][$row['grp_name']][] = $item;

}

然后在同一个 while 循环中,您将该项目分配给一个组数组,然后将其分配给一个菜单数组。您的数组最终将如下所示:

$menuRows = array(
    'menu1'=>array(
        'group1'=>array($item1, $item2, $item3), 
        'group2'=>array($item4, $item5, $item6)
    ),
    'menu2'=>array(
        'group3'=>array($item7, $item8, $item9)
)

构建数组后,您将像这样使用 foreach:

foreach($menuRows as $divname=>$grp){
  // echo out what you want... contains Beverages, Salads
  foreach($grp as $grpName=>$itemArr){
     // again, echo out the divs
     foreach($itemArr as $item{
       // and now you can echo out your items
     }
  }
}
于 2013-10-03T20:35:29.510 回答