对于每个类别行产品

时间:2013-06-23 19:30:40

标签: php mysql arrays foreach

我有3张桌子。

module_names(module_id,module_name,module_content)

module_groups(group_id,group_name,group_content)

module_to_group(module_id,group_id)

我正在使用以下查询来获得结果:

$result = $db->sql_query("select 
m.module_id, 
m.module_name, 
g.group_name 
from 
" . $prefix . "_mmmodule_names m ,  
" . $prefix . "_mmmodule_to_group m2g, 
" . $prefix . "_mmmodule_groups g 
where 
m.module_id = m2g.module_id 
and 
m2g.group_id = g.group_id 
and 
g.group_id = g.group_id 
order by 
m.module_id"); 
while($row = $db->sql_fetchrow($result)) { 
$content .= '<div>' . $row['group_name'] . '</div>'; 

$content .= '<div>' . $row['module_name'] . '</div>'; 
} 
echo $content;

输出如下:

组别1

模块1

组别1

单词数

组2

单词数

组2

Module4

但我需要这样:

组别1

模块1

单词数

组2

单词数

单词数

很久以前,我做了类似的事情。 对于我记得我用于每个人的东西。当然,我当时拥有的资源,现在不再是谷歌的十大搜索结果了。 (Groupconcat对我来说不是一个好主意)

3 个答案:

答案 0 :(得分:1)

一切都很简单。只需“记住”最后一个组名,并且在你获得下一个组名之前不要回复它。

$tmpGroupName = null;
$result = $db->sql_query("select m.module_id, m.module_name, g.group_name from " . $prefix . "_mmmodule_names m ,  " . $prefix . "_mmmodule_to_group m2g, " . $prefix . "_mmmodule_groups g where m.module_id = m2g.module_id and m2g.group_id = g.group_id and g.group_id = g.group_id order by m.module_id");
while($row = $db->sql_fetchrow($result)) {

    if ($tmpGroupName != $row['group_name'])
    {
        $tmpGroupName = $row['group_name'];
        $content .= '<div>' . $row['group_name'] . '</div>';
    }

    $content .= '<div>' . $row['module_name'] . '</div>';
}
echo $content;

答案 1 :(得分:1)

$result = $db->sql_query("select m.module_id, m.module_name, g.group_name from " . $prefix . "_mmmodule_names m ,  " . $prefix . "_mmmodule_to_group m2g, " . $prefix . "_mmmodule_groups g where m.module_id = m2g.module_id and m2g.group_id = g.group_id and g.group_id = g.group_id order by m.module_id"); 

$modules = array();
while ($row = $db->sql_fetchrow($result)) { 
    $modules[$row['group_name']][] = $row['module_name'];      
} 

foreach ($modules as $groupName => $moduleNames) {

    echo "<h2>$groupName</h2>";

    foreach ($moduleNames as $moduleName) {
        echo "<p>$moduleName</p>";
    }
}

只记住上一个组名称是不够的,因为它们可以混合,另一个解决方案可能是在查询中添加组名称的排序,在这种情况下,您可以确定组不会混合。

答案 2 :(得分:0)

On解决方案可以是保存状态,通过状态我的意思是在while循环之上创建一个变量并保存组标题名称(例如Group 1)并且在第一次迭代时变量为null您可以打印标题同样,但是对于下一次迭代检查并查看循环中的标题是否等于变量中存储的内容是保存哪个状态。 如果它们相等,你可以再次传递打印标题,如果没有,则意味着它的新组即将到来,你也可以打印标题。

关于内容(对于每个标题),您可以在没有任何条件的情况下在每次迭代中打印。