我正在尝试创建一个按菜单类型(div_id)和项目类型(grp_id)划分的菜单页面,并显示项目信息:标题,说明,价格等。尽管每个grp_id都是如下所示应该在它自己的html表中(例如“啤酒瓶装”所有项目列在一个表中,“啤酒 - 草稿”在另一个表中)。此外,每个菜单(例如Beverages,Salads等)都应该在一个单独的手风琴窗口中:
啤酒瓶装
基利安:4.75美元 莫尔森:4.75美元 佩罗尼:6.00美元
啤酒 - 草稿
吉尼斯:5.50美元
葡萄酒 - 红色
Banfi,“Colle di Sasso”,意大利:15.75美元 Bell'agio,基安蒂,意大利:16.95美元
葡萄酒 - 白色
Beringer,Moscato,Califormia:14.95美元 Placido,Pinot Grigio,意大利:14.95美元
开胃菜沙拉:6.25美元 烤鸡肉沙拉:7.95美元 Mesclun Side Salad:4.95美元
等等......
列类型为空默认值
menu_id int(10)否
div_id int(10)否
grp_id int(10)是NULL
cat_id int(10)是NULL
date_b日期否
date_e日期否
价格浮动(6,2)是NULL
price2 float(6,2)是NULL
price3 float(6,2)是NULL
title varchar(255)否
descr文本是NULL
特殊枚举('n','y')否n
ordr int(4)No 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> </th><th> </th><th> </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>';
}
问题是每个菜单的重复次数与该类别中的项目一样多。例如,Beverages有8个项目,因此Beverages部分重复8次。每个类别条目重复等于该类别中的项目数。这显然是嵌套foreach函数的结果,但我无法弄清楚正确的代码。
此外,显示的代码不会根据grp_name进行过滤,因此所有饮料最终会出现在一个html表,啤酒和葡萄酒中。虽然Wine - red将有自己的餐桌,就像啤酒 - 吃水一样,所有的饮料都会重复。
非常感谢任何帮助。
答案 0 :(得分: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
}
}
}