首页 > 解决方案 > 如何在php中进行记录的内部循环

问题描述

我正在学习 PHP,我想知道如何使用 PHP 中的记录进行内部循环或嵌套循环。如果有人向我解释如何在 PHP 中执行这种类型的循环,我将不胜感激。

我在 MySQL [ 在此处输入图像描述]中有这张表

我只想在 PHP 中创建一个如下所示的报告表: 在此处输入图像描述

到目前为止,我知道如何使用下面的代码执行当前循环,但我如何在同一个循环和内部循环中执行以显示如上表所示的菜肴。我知道如何创建格式(表格、空格等),我只需要 PHP 逻辑以最佳方式执行此操作。

<?php  
do {  ?>
Table in here
 <?php } while ($selecc =    mysqli_fetch_assoc($conmenu));  ?>

标签: phpnested-loops

解决方案


干净/直接的方法应该是这样的:

SELECT Client, Option, GROUP_CONCAT(Dish SEPARATOR ', ')
FROM table_name
GROUP BY Client, Option

然后,您的数据已经分组并粘合在一起,只需在结果集的单个循环中打印您的字符串。

在这里使用 ado {} while ()没有任何好处。

这是一个未经测试的片段......

if ($conmenu) {
    echo '<table>';
        echo '<tr><td>Client</td><td>Option</td><td>Dishes</td></tr>';
        while ($row = mysqli_fetch_assoc($conmenu)) {
            echo '<tr><td>' , implode('</td><td>', $row) , '</td></tr>';
        }
    echo '</table>';
}

作为记录:

GROUP_CONCAT() 函数的最大允许结果长度(以字节为单位)。默认值为 1024。

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len

此外,$conmenu它是可迭代的,因此您可以使用 foreach 而不是 while 循环。

foreach ($conmenu as $row) { ...

如果你想以艰难的方式做到这一点......

SELECT Client, Option, Dish
FROM table_name
ORDER BY Client, Option

然后...(未经测试)

if ($conmenu) {
    echo '<table>';
        echo '<tr><td>Client</td><td>Option</td><td>Dishes</td></tr>';

        $group = null;
        foreach ($conmenu as $row) {
            if ($group !== $row['Client'] . '_' . $row['Option']) {
                if ($group !== null) {
                    echo '</td></tr>';
                }
                echo '<tr><td>' , implode('</td><td>', $row);
            } else {
                echo ", " , $row['Dish'];
            }
            $group = $row['Client'] . '_' . $row['Option'];  // update group
        }
        echo '</td></tr>';  // close final iteration
    echo '</table>';
}

推荐阅读