You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多维数组重组:反转标签与视频ID的多对多关系

更简洁地实现标签与视频ID的映射反转

嘿,这个需求我太熟悉了!要把「标签名→多个视频ID」的关系反转成「视频ID→多个标签名」,确实可以摆脱嵌套循环的繁琐,用更简洁的数组操作来实现,核心思路是先构建一个视频ID到标签数组的中间映射,再转换成你需要的输出格式。

实现步骤与代码

  1. 构建视频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;
        }
    }
    
  2. 转换为预期的输出格式
    接着把中间映射数组转换成你需要的二维数组结构,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:22