迭代PHP数组并提取值

时间:2013-10-03 20:11:28

标签: php mysql arrays

我正在尝试创建一个按菜单类型(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美元

等等......

数据位于MYSQL表中:

列类型为空默认值

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>&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>';
}

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

此外,显示的代码不会根据grp_name进行过滤,因此所有饮料最终会出现在一个html表,啤酒和葡萄酒中。虽然Wine - red将有自己的餐桌,就像啤酒 - 吃水一样,所有的饮料都会重复。

非常感谢任何帮助。

1 个答案:

答案 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
     }
  }
}