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

如何处理消息数组,移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:00