按嵌套数组的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
相关产品推荐
相关产品推荐

