上一篇
程序员小张最近遇到了一个头疼的问题——他从数据库导出的用户数据里,竟然有大量重复的ID!😱 这导致他的报表计算总是出错,老板的脸色越来越难看...别担心!今天我们就来聊聊PHP数组去重的各种骚操作,让你的数据瞬间"瘦身"成功!
想象一下这些场景:
这时候,一个高效的数组去重函数就是你的救命稻草!✨
$fruits = ['苹果', '香蕉', '苹果', '橙子']; $uniqueFruits = array_unique($fruits); print_r($uniqueFruits); // 输出:Array ( [0] => 苹果 [1] => 香蕉 [3] => 橙子 )
⚠️ 注意:它会保留第一个出现的值,后续重复值会被移除
$colors = ['红', '绿', '蓝', '绿']; $uniqueColors = array_keys(array_flip($colors)); // 输出:Array ( [0] => 红 [1] => 绿 [2] => 蓝 )
🌟 原理:数组键名必须唯一,翻转后自然去重
$nums = [1, 2, 2, 3]; $result = []; foreach ($nums as $num) { if (!in_array($num, $result)) { $result[] = $num; } } // 输出:Array ( [0] => 1 [1] => 2 [3] => 3 )
🎯 适合需要自定义去重逻辑的场景
$data = ['a', 'b', 'a', 'c']; $uniqueData = array_reduce($data, function($carry, $item){ if (!in_array($item, $carry)) $carry[] = $item; return $carry; }, []);
🧠 适合喜欢函数式风格的老司机
class User { public $id; public function __construct($id) { $this->id = $id; } } $users = [new User(1), new User(2), new User(1)]; $uniqueUsers = array_reduce($users, function($result, $user){ if (!isset($result[$user->id])) { $result[$user->id] = $user; } return $result; }, []);
🚀 处理对象数组时特别有用
方法 | 10万数据耗时 | 特点 |
---|---|---|
array_unique() | 12秒 | 简单但内存占用高 |
array_flip() | 08秒 | 最快但会重置键名 |
foreach+in_array | 25秒 | 灵活但大数据量慢 |
💡 一般场景用array_flip()最快,需要保留顺序用array_unique()
// 原始订单数据(可能有重复订单号) $orders = [ ['order_no' => '1001', 'product' => '手机'], ['order_no' => '1002', 'product' => '耳机'], ['order_no' => '1001', 'product' => '手机壳'] // 重复订单 ]; // 按order_no去重 $uniqueOrders = []; foreach ($orders as $order) { $uniqueOrders[$order['order_no']] = $order; } $uniqueOrders = array_values($uniqueOrders);
Q:去重后键名不连续怎么办?
A:用array_values()重置索引:
$fixedArray = array_values($uniqueArray);
Q:如何区分大小写去重?
A:array_unique()默认区分大小写,需要不区分时:
$lowerArray = array_map('strtolower', $originalArray); $uniqueArray = array_unique($lowerArray);
小张终于可以交出一份干净的数据报表了!老板露出了满意的笑容~ 😎 下次遇到数组去重,你知道该怎么做了吧?
本文由 马伟彦 于2025-08-01发表在【云服务器提供商】,文中图片由(马伟彦)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/502365.html
发表评论