メニュー タイプ (div_id) とアイテム タイプ (grp_id) で分割され、アイテム情報 (タイトル、説明、価格など) を表示するメニュー ページを作成しようとしています。それは独自の html テーブルです (たとえば、「ビール - 瓶詰め」のすべてのアイテムが 1 つのテーブルにリストされ、「ビール - ドラフト」が別のテーブルにリストされます)。また、各メニュー (例: 飲み物、サラダなど) は別のアコーディオン ウィンドウに表示する必要があります。
飲料
ビール - 瓶詰め
キリアンズ : $4.75
モルソン : $4.75
ペローニ : $6.00
ビール - 生
ギネス : $5.50
ワイン - 赤
バンフィ、「コッレ ディ サッソ」、イタリア : $15.75
ベラージオ、キャンティ、イタリア : $16.95
ワイン - 白
ベリンジャー、モスカート、カリフォルニア州: $14.95
プラシド、ピノ グリージョ、イタリア: $14.95
サラダ
アンティパスト サラダ : $6.25
グリルド チキン サラダ : $7.95
メスクラン サイド サラダ : $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
special enum('n', 'y') いいえ n
ordr int(4) いいえ 10
div_id、grp_id、および cat_id は外部キーで、そのテーブルにはメニュー タイプ (div_id)(div_name) とアイテム タイプ (grp_id)(grp_name) が含まれています。
これを達成しようとして、次のようにDBにクエリを実行しました:
$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 に基づいてフィルタリングされていないため、すべての飲料が 1 つの html テーブル (ビールとワイン) にまとめられています。Wine - red には Beer - Draft と同様に独自のテーブルがありますが、すべての飲み物はそれぞれで繰り返されます。
どんな助けでも大歓迎です。