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

聖光之護
发布: 2025-10-14 13:21:01
原创
248人浏览过

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(问卷调查和问题之间的关联)。

Zevi AI
Zevi AI

一个服务于电子商务品牌的AI搜索引擎,帮助他们的客户轻松找到想要的东西

Zevi AI 88
查看详情 Zevi AI
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 代码演示了如何使用查询结果构建目标数组结构:

<?php

// 假设 $conn 是你的数据库连接对象,并且已经成功连接到数据库

$sql = "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";
$result = $conn->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);

?>
登录后复制

代码解释:

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

注意事项

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

总结

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

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

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号