如何利用PDO从MySQL结果生成指定结构的三维数组?
先直接给你结论:PDO没办法直接帮你生成这种嵌套的三维数组——它只能返回平展的结果集(比如每一行是一个独立的关联数组),你需要用PHP手动遍历结果来构建目标结构。
先回顾下你的需求和现有数据:
你想要的最终三维数组结构:
{
university A {
year 1 {
course 1: 10
course 2: 20
...
}
year 2 {
course 1: 15
course 2: 20
...
}
...
}
university B {
year 1 {
course 1: 10
course 2: 20
...
}
year 2 {
course 1: 15
course 2: 20
...
}
...
}
}
而你的MySQL查询返回的是平展的行数据:
uni name | year | course name | number
University A | 2014 | course_1 | 10
University A | 2014 | course_2 | 18
University A | 2015 | course_1 | 15
University A | 2015 | course_2 | 20
University B | 2014 | course_1 | 10
University B | 2014 | course_2 | 18
University B | 2015 | course_1 | 15
University B | 2015 | course_2 | 20
具体实现步骤
下面是完整的PHP+PDO代码示例,帮你把平展结果转成目标三维数组:
1. 执行查询并获取结果
首先假设你已经建立了PDO连接,执行查询并准备读取结果:
// 假设已经初始化好PDO连接 $pdo $dbQuery = "SELECT `uni name`, `year`, `course name`, `number` FROM your_table"; $stmt = $pdo->prepare($dbQuery); $stmt->execute();
2. 遍历结果构建三维数组
根据数据量大小,你可以选择两种方式:
方式一:一次性获取所有结果(适合小数据集)
如果数据量不大,直接把所有结果加载到内存再处理:
$flatResults = $stmt->fetchAll(PDO::FETCH_ASSOC); $targetArray = []; foreach ($flatResults as $row) { $uniName = $row['uni name']; $year = $row['year']; $courseName = $row['course name']; $number = $row['number']; // 初始化大学层级 if (!isset($targetArray[$uniName])) { $targetArray[$uniName] = []; } // 初始化年份层级 if (!isset($targetArray[$uniName][$year])) { $targetArray[$uniName][$year] = []; } // 赋值课程对应的数值 $targetArray[$uniName][$year][$courseName] = $number; }
方式二:逐行读取(适合大数据集,内存友好)
如果数据量很大,逐行读取可以避免一次性加载所有数据到内存,减少服务器压力:
$targetArray = []; // 逐行遍历结果,内存占用更低 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $uniName = $row['uni name']; $year = $row['year']; $courseName = $row['course name']; $number = $row['number']; if (!isset($targetArray[$uniName])) { $targetArray[$uniName] = []; } if (!isset($targetArray[$uniName][$year])) { $targetArray[$uniName][$year] = []; } $targetArray[$uniName][$year][$courseName] = $number; }
效果验证
执行完上面的代码后,$targetArray就会完全符合你想要的三维数组结构,比如打印出来会是:
Array ( [University A] => Array ( [2014] => Array ( [course_1] => 10 [course_2] => 18 ) [2015] => Array ( [course_1] => 15 [course_2] => 20 ) ) [University B] => Array ( [2014] => Array ( [course_1] => 10 [course_2] => 18 ) [2015] => Array ( [course_1] => 15 [course_2] => 20 ) ) )
内容的提问来源于stack exchange,提问作者budgiebeaks

