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

PHP数组过滤:移除已出现的双向用户对话记录

解决PHP数组中过滤双向重复对话的问题

错误原因分析

你之前用array_filter的写法逻辑有误:当使用ARRAY_FILTER_USE_BOTH时,回调里的$k是外层数组的索引(比如0、1、2),而非数组元素内部的键名(比如id_sender),所以你的条件永远不会成立,自然过滤无效。

正确实现思路

要过滤双向重复对话,关键是给每一组对话生成唯一的统一标识:将对话双方的id_sender和id_receiver按从小到大排序后拼接成字符串,这样A→B和B→A会生成完全相同的标识。然后用一个辅助数组记录已经出现过的标识,遍历原数组时只保留首次出现的对话。

代码实现

$conversations = [
    ["id" => 76, "id_sender" => 1, "id_receiver" => 2, "message" => "2 Miliar", "is_read" => 0, "created_at" => "2022-11-28T13:57:17.000000Z", "updated_at" => "2022-11-28T13:57:17.000000Z"],
    ["id" => 75, "id_sender" => 1, "id_receiver" => 3, "message" => "1 Miliar", "is_read" => 0, "created_at" => "2022-11-28T13:57:10.000000Z", "updated_at" => "2022-11-28T13:57:10.000000Z"],
    ["id" => 74, "id_sender" => 3, "id_receiver" => 1, "message" => "Property ini berapa harganya?", "is_read" => 1, "created_at" => "2022-11-28T13:52:57.000000Z", "updated_at" => "2022-11-28T13:55:37.000000Z"],
    ["id" => 73, "id_sender" => 2, "id_receiver" => 1, "message" => "Untuk yang ini berapa harganya?", "is_read" => 1, "created_at" => "2022-11-28T13:07:34.000000Z", "updated_at" => "2022-11-28T13:55:33.000000Z"]
];

$seen = [];
$filtered = [];

foreach ($conversations as $conv) {
    // 生成统一标识:将两个id排序后拼接
    $pair = [$conv['id_sender'], $conv['id_receiver']];
    sort($pair);
    $key = implode('-', $pair);
    
    if (!isset($seen[$key])) {
        $seen[$key] = true;
        $filtered[] = $conv;
    }
}

// 输出结果
print_r($filtered);

结果说明

运行上述代码后,$filtered数组就是你期望的结果——仅保留首次出现的对话,自动过滤掉反向的重复对话。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:10:14