如何处理消息数组,移除seen_by中重复用户ID仅保留最后一次出现记录?
实现方案
核心思路
- 逆序遍历所有消息,从最后一条最新消息往最早的第一条消息遍历
- 维护一个已出现用户ID的集合,记录所有在更靠后消息里已经存在的
user_id - 遍历当前消息的
seen_by数组,过滤掉所有已经在集合中的user_id,剩下的就是当前消息需要保留的用户 - 把当前消息保留的
user_id全部加入集合,供前面更旧的消息做过滤使用
如果消息数组索引不是连续的正整数,可以用array_reverse实现逆序遍历,适配性更强。
PHP代码示例
// 示例输入数组 $messages = [ 1 => [ 'seen_by' => [ 1 => 'user_1', 2 => 'user_2', 3 => 'user_3' ] ], 2 => [ 'seen_by' => [ 2 => 'user_2', 3 => 'user_3' ] ], 3 => [ 'seen_by' => [ 3 => 'user_3' ] ] ]; $existedUserIds = []; // 逆序遍历消息数组 for ($i = count($messages); $i >= 1; $i--) { $currentSeenBy = $messages[$i]['seen_by']; // 过滤掉已经在更靠后消息出现过的用户 $filteredSeenBy = array_filter($currentSeenBy, function($userId) use (&$existedUserIds) { return !in_array($userId, $existedUserIds); }, ARRAY_FILTER_USE_KEY); // 更新当前消息的seen_by字段 $messages[$i]['seen_by'] = $filteredSeenBy; // 将当前保留的用户ID加入已存在集合 foreach (array_keys($filteredSeenBy) as $userId) { $existedUserIds[] = $userId; } } // 打印结果验证 print_r($messages);
输出结果
Array ( [1] => Array ( [seen_by] => Array ( [1] => user_1 ) ) [2] => Array ( [seen_by] => Array ( [2] => user_2 ) ) [3] => Array ( [seen_by] => Array ( [3] => user_3 ) ) )
内容的提问来源于stack exchange,提问作者SelvsterTP
相关产品推荐
相关产品推荐

