二维数组去重:优先保留Flying Tour列非空行的实现需求
Hey,针对你这个二维数组去重且优先保留Flying Tour非空记录的需求,我给你整理了一套清晰的实现方案,用PHP来写的(毕竟你给的示例是PHP数组格式):
实现思路与代码
核心思路
- 先以
Access ID作为用户的唯一标识,把所有同用户的记录归为一组,方便后续筛选 - 遍历每个用户的分组记录:优先挑选
Flying Tour字段非空(去除首尾空格后仍不为空)的条目;如果该用户所有记录的这个字段都是空的,就保留第一条基础记录,确保不丢失用户信息 - 最后把筛选后的记录重新整理成最终的去重数组
完整代码示例
<?php // 补全后的示例数据(方便演示重复记录的处理逻辑) $data = [ [ 'Access ID' => 12345, 'Registration Date' => '2018-02-27', 'First Name' => 'Damian', 'Last Name' => 'Martin', 'Flying Tour' => '' ], [ 'Access ID' => 12345, 'Registration Date' => '2018-02-28', 'First Name' => 'Damian', 'Last Name' => 'Martin', 'Flying Tour' => 'Paris' ], [ 'Access ID' => 67890, 'Registration Date' => '2019-05-10', 'First Name' => 'Luna', 'Last Name' => 'Gray', 'Flying Tour' => '' ] ]; // 第一步:按Access ID分组,归集同用户的所有记录 $groupedRecords = []; foreach ($data as $record) { $accessId = $record['Access ID']; if (!isset($groupedRecords[$accessId])) { $groupedRecords[$accessId] = []; } $groupedRecords[$accessId][] = $record; } // 第二步:筛选每组的有效记录 $uniqueData = []; foreach ($groupedRecords as $userId => $records) { $selectedRecord = null; foreach ($records as $record) { // 排除空白字符干扰,检查Flying Tour是否真正非空 if (!empty(trim($record['Flying Tour']))) { $selectedRecord = $record; break; // 找到符合条件的就停止遍历,保证优先性 } } // 兜底:如果没有非空记录,保留第一条基础信息 if ($selectedRecord === null) { $selectedRecord = $records[0]; } $uniqueData[] = $selectedRecord; } // 输出结果验证 print_r($uniqueData); ?>
代码关键点解释
- 分组逻辑:用
Access ID作为键分组,确保同一用户的所有记录都被归集,不会遗漏任何待筛选的条目 - 优先筛选:遍历分组内记录时,一旦找到
Flying Tour非空的条目就立即选中并跳出循环,严格保证该条记录的优先保留权 - 兜底处理:如果某个用户的所有记录里
Flying Tour都是空的,就保留第一条记录,避免丢失注册日期、姓名等核心用户信息
简化写法(PHP7+适用)
如果你想用更简洁的代码实现分组,可以用array_reduce替代foreach循环:
// 用array_reduce简化分组步骤 $groupedRecords = array_reduce($data, function ($carry, $item) { $carry[$item['Access ID']][] = $item; return $carry; }, []);
内容的提问来源于stack exchange,提问作者Saurav
相关产品推荐
相关产品推荐

