
本文旨在帮助开发者使用 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 Question FROM questionnaires INNER JOIN questionnaireshasquestions qa ON qa.idQuestionnaire = questionnaires.id INNER 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 格式,方便在前端或其他应用程序中使用。











