【问题标题】:PHP foreach array ouput to table with empty cellsPHP foreach 数组输出到带有空单元格的表
【发布时间】:2015-07-25 02:21:31
【问题描述】:

我正在尝试为自己制定一个简单的教学计划,但卡在了我的数组的输出上。

这是 PHP:

echo '<table><thead><tr><th>Period</th><th>1</th><th>2</th><th>3</th>th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th></tr>';
echo '<tr><th>Time</th><th>08:50</th><th>09:40</th><th>10:30</th><th>11:20</th><th>12:10</th><th>13:00</th><th>13:50</th><th>14:40</th><th>13:30</th></tr>';
echo '</thead><tbody>';
$results = $db->mysql->query("SELECT * FROM schedule");
if ($results->num_rows) {
    while ($row = $results->fetch_assoc()) {
        $days[$row['day']][$row['period']] = $row['classroom'];
    } // close days while

    foreach ($days as $key => $val) {
        echo '<tr><td>' . $key .
            '</td>';
        foreach ($val as $item) {
            echo '<td>' . $item .
                '</td>';
        }
        echo '</tr>';
    }
}
echo '</tbody></table>';

这给了我一个这样的数组:

Array
(
[Monday] => Array
    (
        [1] => m5 biology
        [6] => m5 ict
        [8] => m6 ict
    )

[Tuesday] => Array
    (
        [3] => m5 biology
        [6] => m6 ict
        [7] => m6 ict
    )

[Wednesday] => Array
    (
        [1] => m6 biology
        [2] => m5 ict
        [7] => m5 biology
        [8] => m2 ict
    )

[Thursday] => Array
    (
        [1] => m6 biology
    )

[Friday] => Array
    (
        [1] => m6 biology
        [6] => m6 ict
    )

表格输出如下所示:

...
<tr>
  <td>Monday</td>
  <td>m5 biology</td>
  <td>m5 ict</td>
  <td>m6 ict</td>
</tr>
...

我希望输出包含空闲时段的空表格单元格。在星期一的示例中,只有周期 1、6、8 的数据,因此它只显示这些单元格。

如何让此代码也输出 2、3、4、5、7、9 周期的空单元格?像这样:

...
<tr>
  <td>Monday</td>
  <td>m5 biology</td>
  <td>&nbsp</td>
  <td>&nbsp</td>
  <td>&nbsp</td>
  <td>&nbsp</td>
  <td>m5 ict</td>
  <td>&nbsp</td>
  <td>m6 ict</td>
  <td>&nbsp</td>
</tr>

我想过在 foreach 中使用 if 语句,但我不知道我需要建立什么样的关系。

任何帮助将不胜感激。

【问题讨论】:

  • 有很多选择。您可以更改 PHP,也可以更改 SQL...,甚至两者都更改。我知道我不会在foreach 中使用if,因为那时您不妨改用for

标签: php arrays html-table


【解决方案1】:

由于您使用的是数字键,并且您知道一周只有 7 天,因此不要使用 foreach(),而是使用 for():

for($i = 1; $i <= 7; $i++) {
    if(isset($array[$i])) { 
       ... there's info for this day, output it
    } else {
       ... no info, output a blank cell
    }
}

【讨论】:

    【解决方案2】:

    试试这个

    <?php
    $data = array (
      "Monday" => Array
        (
            1 => "m5 biology",
            6 => "m5 ict",
            8 => "m6 ict",
        ),
    
      "Tuesday" => Array
        (
            3 => "m5 biology",
            6 => "m6 ict",
            7 => "m6 ict",
        ),
    
      "Wednesday" => Array
        (
            1 => "m6 biology",
            2 => "m5 ict",
            7 => "m5 biology",
            8 => "m2 ict",
        ),
    
      "Thursday" => Array
        (
            1 => "m6 biology",
        ),
    
      "Friday" => Array
        (
            1 => "m6 biology",
            6 => "m6 ict",
        )
    );
    
    
    $table = "<table border = '1'><tr><td>Day</td>";
    for ($x = 1; $x<8; $x++) {
        $table .= "<td>Period $x</td>";
    }   
    $table .= "</tr>";
    foreach ($data as $day => $classes) {
        $table .= "<tr><td>$day</td>";
        for ($x = 1; $x<8; $x++) {
            if (isset($classes[$x])) {
                $table .= "<td>" . $classes[$x] . "</td>";
            } else {
                $table .= "<td></td>";
            }
        }
        $table .= "</tr>";
    }
    $table .= "</table>";
    echo $table;
    

    【讨论】:

    • 感谢您提供如此完整的答案。这正是我一直在寻找的。干杯!
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 2017-05-12
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多