dongshanjin8947 2018-01-03 17:09
浏览 46

如何使用foreach正确显示mysql表中的数据?

I'm doing my school's timetable on php page using mysql and I have mysql table like this

klass | day | lesson_name
7A | Monday | lesson1
7A | Monday | lesson5
7A | Monday | lesson3
7A | Tuesday | lesson2
7A | Tuesday | lesson1
7A | Tuesday | lesson4
7A | Wednesday| lesson5
7A | Wednesday| lesson2
7A | Wednesday| lesson1
7A | Thursday | lesson3
7A | Thursday | lesson5
7A | Thursday | lesson4
7А | Friday | lesson2
7А | Friday | lesson3
7А | Friday | lesson5
...And other classes

And this is part of my code:

    <table border="1">
      <tr align=center>
        <th>Monday</th>
        <th>Tuesday</th>
        <th>Wednesday</th>
        <th>Thursday</th>
        <th>Friday</th>
      </tr>
      <?php
        //$con = mysqli_connect("localhost", "user", "password", "database");
        //if (mysqli_connect_errno()) {
        //   echo "Failed to connect to MySQL: " . mysqli_connect_error();
        //}
        $klass = $_POST['klass'];
        $res1 = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass' AND `day` LIKE 'Monday'");
        $res2 = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass' AND `day` LIKE 'Tuesday'");
        $res3 = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass' AND `day` LIKE 'Wednesday'");
        $res4 = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass' AND `day` LIKE 'Thursday'");
        $res5 = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass' AND `day` LIKE 'Friday'");
        foreach ($res5 as $row5) {
            echo "<tr>";
            echo "<td align='center'>$row1[lesson_name]</td>";
            echo "<td align='center'>$row2[lesson_name]</td>";
            echo "<td align='center'>$row3[lesson_name]</td>";
            echo "<td align='center'>$row4[lesson_name]</td>";
            echo "<td align='center'>$row5[lesson_name]</td>";
            echo "</tr>";
        }
      ?>
    </table>

With that code I only display Friday column. I know that the problem is in foreach. I tried to rewrite it as: foreach ($res1 as $row1 and $res2 as $row2 and $res3 as $row3 and $res4 as $row4 and $res5 as $row5), but then it display nothing ;(

How to rewrite my foreach and display all columns&lessons in my timetable correctly?

UPD. I have done as Philipp said, but this code display nothing:

    <table border="1">
      <tr align=center>
        <th>Monday</th>
        <th>Tuesday</th>
        <th>Wednesday</th>
        <th>Thursday</th>
        <th>Friday</th>
      </tr>
      <?php
        //$con = mysqli_connect("localhost", "user", "password", "database");
        //if (mysqli_connect_errno()) {
        //   echo "Failed to connect to MySQL: " . mysqli_connect_error();
        //}
        $klass = $_POST['klass'];
        $res = mysqli_query($con, "SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass'");
        $groupedLessons = array_reduce($res, function($groups, $lesson) {
            if (!array_key_exists($lesson['day'], $groups)) {
                $groups[$lesson['day']] = [];
            }
            $groups[$lesson['day']][] = $lesson;
            return $groups;
        }, []);
        foreach($groupedLessons as $day => $lessons) {
            foreach ($lessons as $lesson) {
            <tr>
                <td><?= $klass ?></td>
                <td><?= $day ?></td>
                <td><?= $lesson['lesson_name'] ?></td>
            </tr>
            }
        }
      ?>
</table>
  • 写回答

1条回答 默认 最新

  • doulai2573 2018-01-03 17:21
    关注

    The best way for you is to make only one DB query, that gets all lessons at once:

    SELECT * FROM `Timetable` WHERE `klass` LIKE '$klass'
    

    Then you can group the values based on the week day:

    $groupedLessons = array_reduce($allLessons, function($groups, $lesson) {
            if (!array_key_exists($lesson['day'], $groups)) {
                $groups[$lesson['day']] = [];
            }
            $groups[$lesson['day']][] = $lesson;
            return $groups;
        }, []);
    

    Now you can iterate over the data with two nested foreach loops:

    foreach($groupedLessons as $day => $lessons) {
        foreach ($lessons as $lesson) {
        ?>
        <tr>
            <td><?= $klass ?></td>
            <td><?= $day ?></td>
            <td><?= $lesson['lesson_name'] ?></td>
        </tr>
        <?php
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了