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

按嵌套数组的fileid键移除多维数组中的重复嵌套数组

按fileid过滤嵌套数组中的重复项

你的需求是对每个文件所有者(外层键ABCD、EFGH)下的文件数组,移除fileid重复的项。之前的方法无效是因为它们针对的是外层数组元素的去重,而非内层子数组按fileid去重,以下是可行的解决方案:

方法一:foreach遍历过滤

这是最直观的实现方式,通过记录已出现的fileid来保留唯一项:

$filteredArray = [];
// 遍历每个文件所有者的数组
foreach ($file_array as $ownerId => $files) {
    $seenFileIds = [];
    $filteredFiles = [];
    // 遍历当前所有者下的所有文件
    foreach ($files as $file) {
        $fileId = $file['fileid'];
        // 如果该fileid未出现过,就保留当前文件
        if (!isset($seenFileIds[$fileId])) {
            $seenFileIds[$fileId] = true;
            $filteredFiles[] = $file;
        }
    }
    $filteredArray[$ownerId] = $filteredFiles;
}

方法二:用array_map+array_reduce简化代码

利用数组函数链式调用,实现更简洁的写法,同时自动去重:

$filteredArray = array_map(function($files) {
    // 用fileid作为临时数组的键,自动去重
    $uniqueFiles = array_reduce($files, function($carry, $file) {
        if (!isset($carry[$file['fileid']])) {
            $carry[$file['fileid']] = $file;
        }
        return $carry;
    }, []);
    // 转换回数字索引的数组(可选,若不需要保留fileid作为键)
    return array_values($uniqueFiles);
}, $file_array);

补充说明

两种方法默认保留每个fileid第一次出现的项。如果需要保留最后一次出现的项,只需调整逻辑:

  • 方法一中,将判断改为$seenFileIds[$fileId] = true; $filteredFiles[$fileId] = $file;,最后用array_values($filteredFiles)转成数字索引数组即可。
  • 方法二中,直接去掉判断条件,每次都用当前文件覆盖对应fileid的项即可。

内容的提问来源于stack exchange,提问作者Abhik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:43:17