多维数组重组:反转标签与视频ID的多对多关系
更简洁地实现标签与视频ID的映射反转
嘿,这个需求我太熟悉了!要把「标签名→多个视频ID」的关系反转成「视频ID→多个标签名」,确实可以摆脱嵌套循环的繁琐,用更简洁的数组操作来实现,核心思路是先构建一个视频ID到标签数组的中间映射,再转换成你需要的输出格式。
实现步骤与代码
构建视频ID到标签的映射数组
我们先遍历原数组,拆分每个标签对应的视频ID,把标签名归集到对应视频ID的数组中:$allTags = [ [ "name" => "TAG-ONE", "video" => "64070,64076,64110,64111" ], [ "name" => "TAG-TWO", "video" => "64070,64076,64110,64111" ], [ "name" => "TAG-THREE", "video" => "64111" ] ]; // 初始化中间映射数组:键=视频ID,值=标签名数组 $videoTagsMap = []; foreach ($allTags as $tagItem) { $tagName = $tagItem['name']; // 拆分视频ID字符串为单个ID数组 $videoIds = explode(',', $tagItem['video']); foreach ($videoIds as $videoId) { // 简化初始化:如果视频ID不存在则创建空数组 $videoTagsMap[$videoId] = $videoTagsMap[$videoId] ?? []; // 将当前标签添加到对应视频ID的数组中 $videoTagsMap[$videoId][] = $tagName; } }转换为预期的输出格式
接着把中间映射数组转换成你需要的二维数组结构,用implode把标签数组拼接成逗号分隔的字符串:
如果你喜欢更简洁的函数式写法,可以用array_map:$allTagsResult = array_map(function($videoId, $tags) { return [ 'name' => implode(',', $tags), 'video' => $videoId ]; }, array_keys($videoTagsMap), $videoTagsMap);要是觉得函数式写法不够直观,普通foreach也足够清晰:
$allTagsResult = []; foreach ($videoTagsMap as $videoId => $tags) { $allTagsResult[] = [ 'name' => implode(',', $tags), 'video' => $videoId ]; }
为什么这比嵌套循环更好?
- 自动去重视频ID:利用数组键的唯一性,不需要额外判断视频ID是否已存在,逻辑更简洁。
- 逻辑分层清晰:先归集映射,再转换格式,代码可读性更高,后续维护也方便。
- 扩展性强:如果后续需要对标签去重、排序,只需要在归集映射时做少量修改(比如用
array_unique或sort)。
运行这段代码后,就能得到你预期的输出结果啦!
内容的提问来源于stack exchange,提问作者Punit Gajjar
相关产品推荐
相关产品推荐

