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
相关产品推荐
相关产品推荐

