PHP 从 SQL 获取包含子数组的数组

php 从 sql 获取包含子数组的数组

本文旨在帮助开发者使用 PHP 从 SQL 数据库中检索数据,并将其组织成一个包含问卷调查及其对应问题的多维数组。通过提供的示例代码,你将学习如何正确构建数据结构,避免数据重复,最终生成符合预期的 JSON 格式。

在 PHP 中,从 SQL 数据库获取数据并将其组织成特定的数组结构是一项常见的任务。当数据之间存在层级关系时,例如问卷调查及其对应的问题,我们需要构建多维数组来反映这种关系。本教程将指导你如何使用 PHP 从 SQL 查询结果构建一个包含问卷调查及其问题的数组,并避免数据重复的问题。

理解数据结构

目标数据结构如下:

[  {    "Questionnaires": {      "id": "x",      "name": "x",      "questions": [        {          "id": "x",          "name": "x"        },        {          "id": "x2",          "name": "x2"        }      ]    }  }]

这个结构表示一个包含多个问卷调查的数组。每个问卷调查都有一个 id 和 name,以及一个包含多个问题的 questions 数组。每个问题也有一个 id 和 name。

立即学习“PHP免费学习笔记(深入)”;

SQL 查询

首先,我们需要编写 SQL 查询来获取所需的数据。假设我们有三个表:questionnaires(问卷调查)、questions(问题)和 questionnaireshasquestions(问卷调查和问题之间的关联)。

SELECT  questionnaires.id AS QuestionnaireId,  questionnaires.title AS QuestionnaireTitle,  questions.id AS QuestionId,  questions.text AS QuestionFROM questionnairesINNER JOIN questionnaireshasquestions qa ON qa.idQuestionnaire = questionnaires.idINNER JOIN questions ON questions.id = qa.idQuestion;

这个查询将返回一个结果集,其中每一行包含一个问卷调查的 ID、标题以及与该问卷调查相关的一个问题的 ID 和文本。

PHP 代码实现

以下 PHP 代码演示了如何使用查询结果构建目标数组结构:

query($sql);$data = ['questionnaires' => []];while ($row = $result->fetch_assoc()) {    $id = $row['QuestionnaireId'];    if (!isset($data['questionnaires'][$id])) {        // 首次遇到此 QuestionnaireId,创建容器来收集相关问题        $data['questionnaires'][$id] = [            'id' => $row['QuestionnaireId'],            'title' => $row['QuestionnaireTitle'],            'questions' => [],        ];    }    // 将问题添加到集合中    $data['questionnaires'][$id]['questions'][] = [        'id' => $row['QuestionId'],        'text' => $row['Question'],    ];}// 将数组重新索引,去除键名$data['questionnaires'] = array_values($data['questionnaires']);// 输出 JSON 格式header('Content-Type: application/json');echo json_encode($data);?>

代码解释:

初始化数组: $data = [‘questionnaires’ => []]; 创建一个包含 questionnaires 键的数组,用于存储问卷调查数据。循环遍历结果集: while ($row = $result->fetch_assoc()) 循环遍历 SQL 查询的结果集。检查 QuestionnaireId 是否存在: if (!isset($data[‘questionnaires’][$id])) 检查当前问卷调查的 ID 是否已经存在于 $data[‘questionnaires’] 数组中。创建新的问卷调查容器: 如果 QuestionnaireId 不存在,则创建一个新的数组元素,包含 id、title 和一个空的 questions 数组。添加问题到问卷调查: 将当前问题的信息(id 和 text)添加到对应问卷调查的 questions 数组中。重新索引数组: 使用 array_values() 函数移除数组的键名,将 $data[‘questionnaires’] 转换为一个纯数字索引的数组。输出 JSON: 使用 json_encode() 函数将数组转换为 JSON 格式,并设置 Content-Type 为 application/json。

注意事项

确保数据库连接 $conn 已经正确建立。根据你的数据库驱动,可能需要使用不同的 fetch 方法(例如,fetch_array、fetch_object)。在生产环境中,应该对 SQL 查询进行参数化,以防止 SQL 注入攻击。根据实际需求,可以对代码进行优化,例如使用更高效的循环方式或缓存查询结果。

总结

通过本教程,你学习了如何使用 PHP 从 SQL 查询结果构建一个包含问卷调查及其问题的多维数组。关键在于理解目标数据结构,并在循环遍历结果集时正确地构建数组。通过检查 QuestionnaireId 是否已经存在,可以避免数据重复的问题。最终,你可以将数组转换为 JSON 格式,方便在前端或其他应用程序中使用。

以上就是PHP 从 SQL 获取包含子数组的数组的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1323962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
jQuery 事件绑定深度解析:确保代码仅在点击时执行
上一篇 2025年12月12日 10:41:24
Yii2中控制器动作前全局代码执行策略
下一篇 2025年12月12日 10:41:39

相关推荐

发表回复

登录后才能评论
关注微信