【问题标题】:PHP: How to loop and skip over database tables without corresponding data in another table?PHP:如何循环和跳过另一个表中没有相应数据的数据库表?
【发布时间】:2020-06-01 17:22:57
【问题描述】:

我对 PHP 比较陌生,仍在学习,我知道这是一个新手问题,但我很乐意并感谢您提供的任何帮助。

我目前正在编写一个网站,该网站使用 PHP 和 MySQL 从“课程”和“类别”数据库表中提取和组织数据。 “课程”表中的每一行通过“category_id”列与特定课程类别相关联,该列链接到“类别”表中的相关“id”列。

因此,例如,如果“类别”表中的类别 3 是“音乐”并且特定课程是关于音乐的,则该课程的“category_id”列值将在“课程”表中设置为“3”。 (我希望我能恰当地解释所有这些;如果不清楚,我很抱歉)。

我想显示当前包含课程的所有课程类别名称,并在每个类别名称下方显示每个类别中的所有课程名称。所以,例如:

  • 音乐:(1) 摇滚,(2) 爵士
  • 绘画:(1) 水彩,(2) 丙烯

这是我用来执行此操作的代码。我正在使用 MVC 框架,其中我将“课程”和“类别”表中的所有数据作为关联数组 $categories 和 $courses 传递到此视图中。

<?php foreach ($categories as $category) : ?>

    <h4><?php echo ($category['name']); ?></h4>

    <?php foreach ($courses as $course) {

        if ($course['category_id'] == $category['id']) : ?>
            <p><?php echo ($course['name']); ?></p>
        <?php endif;
    }

endforeach; ?>

我遇到的问题是我的“类别”表中有类别行,我目前在“课程”表中还没有任何相应的课程。当我建立网站时,这会改变,但现在为了组织起见,我不想从“类别”表中删除这些行。

所以现在,给定上面的代码,我正在输出一个类别和课程列表,如下所示:

  • 舞蹈:
  • 雕塑:
  • 音乐:(1) 摇滚,(2) 爵士
  • 绘画:(1) 水彩,(2) 丙烯

最后,我的问题是:我将如何遍历每个类别,并且仅在“课程”表中有与该 category_id 相关联的相应课程时才显示类别名称? (参考上面的示例,跳过而不显示“舞蹈”和“雕塑”类别,因为还没有任何课程与这些类别相关联)。

再次,如果以上任何内容不清楚,我深表歉意,非常感谢任何人的帮助!

最好, 乔什

【问题讨论】:

  • 提供sql查询你如何加载数据

标签: php mysql database loops


【解决方案1】:

您可以使用类似这样的方法来选择仅包含课程记录的类别

select * from categories inner join courses where categories.id=courses.category_id group by categories.id

为了更好地理解 https://www.w3schools.com/sql/sql_join_inner.asp

【讨论】:

  • 非常感谢您的建议,托马斯!
【解决方案2】:

这不是我自己编写代码的方式 - 但从您已有的内容开始,我将生成一个嵌套数组,将类别 ID 映射到相应课程的数组:

<?php
    $coursesByCategory = [];
    foreach ($courses as $course) {
        $coursesByCategory[$course['category_id']][] = $course;
    }
?>

数组应如下所示:

[
    3 => ['Rock', 'Jazz'],
    4 => ['Watercolor', 'Acrylic']
]

其中 3 是音乐的 ID,4 是绘画的 ID。

然后将您的模板代码更改为:

<?php foreach ($categories as $category) : ?>
    <?php if (!empty($coursesByCategory[$category['id']])) : ?>

        <h4><?php echo $category['name']; ?></h4>

        <?php foreach ($coursesByCategory[$category['id']] as $course) : ?>
            <p><?php echo $course['name']; ?></p>
        <?php endforeach; ?>

    <?php endif; ?>
<?php endforeach; ?>

【讨论】:

  • 谢谢你,保罗!我非常感谢您的见解。您提到您将代码设置与一开始不同。我很好奇,如果你愿意解释,你会怎么做。我真的很感激,并且一直在学习!
  • @Toryn 简而言之:只从数据库中获取所需的内容(使用 JOIN)并在 PHP 中生成单个嵌套数组,因此您可以像 foreach ($categories as $category) { echo "&lt;h4&gt;$category-&gt;name&lt;/h4&gt;"; foreach ($category-&gt;courses as $course) { echo "&lt;p&gt;$course-&gt;name&lt;/p&gt;"; } } 一样使用它。
  • 这是有道理的。谢谢,保罗!非常感谢有机会向您学习。
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 2020-07-18
  • 2011-11-07
  • 2018-03-15
  • 2021-06-05
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多