
本文详解如何使用 php + mysql 实现一对多关系的数据结构化组装,将电影主表(list_movies)与链接子表(links)按 id 关联,并生成含嵌套 url 数组的完整数据结构。
本文详解如何使用 php + mysql 实现一对多关系的数据结构化组装,将电影主表(list_movies)与链接子表(links)按 id 关联,并生成含嵌套 url 数组的完整数据结构。
在开发影视类网站或资源聚合系统时,常需将“一部电影”与其多个播放链接(如 episode1、episode2…)组织为嵌套数组结构。核心难点在于:不能每次循环都重置数组,而应动态追加子项到指定键下。你原始代码中 $arr = [...] 是赋值操作,导致前序 URL 被覆盖;正确做法是直接向 $arr['url'] 中插入新键值对。
以下是优化后的完整实现逻辑(含安全建议与结构扩展):
✅ 正确写法:累加式构建嵌套数组
<?php // 初始化基础结构(可从主表动态读取 name/detail)
$arr = [
'name' => 'test',
'detail' => 'detail',
'url' => [] // 预留空数组,用于后续追加
];
$i = 0;
$select_list_movies = select("SELECT id, name, detail FROM list_movies"); // 建议只查必要字段
while ($movie = mysqli_fetch_assoc($select_list_movies)) {
$movieId = (int)$movie['id']; // 强制转整型,防 SQL 注入风险
// 使用预处理思想(即使当前 select() 封装了 PDO/MySQLi,也应避免拼接)
$links = select(
"SELECT link FROM links WHERE movie_id = ?",
[$movieId] // 假设 select() 支持参数绑定,否则请改用 mysqli_prepare
);
foreach ($links as $linkRow) {
$i++;
$arr['url']['episode' . $i] = ['link' => $linkRow['link']];
}
}
print_r($arr);
?>
⚠️ 关键注意事项:
不要覆盖,要追加:
$arr['url']['episodeX'] = ...是向已有数组添加元素;$arr = [...]则会丢弃之前所有数据。-
避免 N+1 查询:当前方案对每部电影执行一次子查询,数据量大时性能较差。更优解是单次 JOIN 查询 + PHP 分组:
$sql = "SELECT m.id, m.name, m.detail, l.link FROM list_movies m LEFT JOIN links l ON m.id = l.movie_id ORDER BY m.id"; $result = select($sql); $arr = []; $currentMovieId = null; foreach ($result as $row) { if ($row['id'] !== $currentMovieId) { $currentMovieId = $row['id']; $arr[] = [ 'name' => $row['name'], 'detail' => $row['detail'], 'url' => [] ]; } if (!is_null($row['link'])) { $episodeNum = count($arr[count($arr)-1]['url']) + 1; $arr[count($arr)-1]['url']['episode' . $episodeNum] = ['link' => $row['link']]; } } SQL 安全:原始代码中
WHERE list_movies.id = '$id'存在 SQL 注入隐患,务必改用参数化查询(如?占位符 +mysqli_stmt_bind_param或 PDO 的bindValue)。键名语义化:若需按真实集数排序(如 “S01E01”),建议在
links表中增加episode_no字段,替代自增计数器$i。
✅ 最终输出结构示例:
Array
(
[name] => test
[detail] => detail
[url] => Array
(
[episode1] => Array
(
[link] => https://example.com/ep1
)
[episode2] => Array
(
[link] => https://example.com/ep2
)
)
)
掌握这种“主表驱动、子表聚合”的数组构建模式,是处理一对多关系数据的基础能力。实际项目中,还可进一步封装为函数或使用 Laravel Eloquent 的 with() 关系加载,提升可维护性与性能。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











