PHP 数组怎么去重
在日常做网站开发或者数据整理时,常会遇到“重复数据”的小麻烦——比如用户提交的表单里有重复的邮箱,或者从商品列表里导出了重复的ID。如果是用PHP做开发,处理这类问题最常用的就是数组去重,不用写复杂的循环逻辑,PHP自带的工具就能搞定。
先搞懂最实用的内置函数:array_unique()
大部分时候,处理普通字符串、数字组成的数组,用这个函数就够了。它的作用是把数组里重复的元素删掉,只保留第一次出现的那个,返回去重后的新数组,而且不会改变原数组的内容。举个生活化的例子:把你一周里重复买的奶茶口味列成数组,$drinks = ['珍珠奶茶', '原味奶茶', '珍珠奶茶', '抹茶奶茶'],用array_unique()处理后,重复的“珍珠奶茶”就只留一次,变成['珍珠奶茶', '原味奶茶', '抹茶奶茶']。

不过这个函数有个小细节要注意:它默认是按“字符串”对比的,不是按数字类型。比如数组里有1(整数)和'1'(字符串),它会当成两个不同的元素,不会去重。举个例子:$nums = [1, '1', 2],用array_unique()处理后还是[1, '1', 2],不会把数字1和字符串1当成重复项。如果你的数组里同时有数字和字符串形式的同值内容,得先转成统一类型再处理。
特殊情况:处理关联数组的去重
如果你的数组是“键值对”形式的关联数组,比如存用户信息$users = [['id' => 1, 'name' => '张三'], ['id' => 2, 'name' => '李四'], ['id' => 1, 'name' => '张三']],这时候array_unique()就不好用了——它只会对比值,不会考虑键的结构,会把整个数组元素当成字符串判断,结果可能不如预期。
这时候可以换个思路:先把需要去重的字段(比如用户ID)抽出来当临时键,再用array_keys()取唯一键,最后匹配原数组内容。还是刚才的用户数组,先把ID当键存:$temp = array_column($users, null, 'id'),这样得到[1 => ['id'=>1, 'name'=>'张三'], 2 => ['id'=>2, 'name'=>'李四']],重复的ID1会自动覆盖,最后用array_values($temp)把键转回来,就得到去重后的数组。
进阶场景:需要保留键名的去重
如果希望去重后保留原数组的键名,而不是自动重置为数字键,可以用array_unique()的第二个参数,或者搭配array_intersect_assoc()。比如原数组$fruits = ['a' => '苹果', 'b' => '香蕉', 'c' => '苹果'],用array_unique($fruits, SORT_STRING),结果会是['a' => '苹果', 'b' => '香蕉'],原来的键a会保留,不会变成[0 => '苹果', 1 => '香蕉']。
实际开发中,PHP数组去重的需求很常见,不管是后台整理数据、过滤用户提交的内容,还是导出报表前清洗数据,掌握这几种方法就足够应对大部分情况了。不用自己写循环一个个对比元素,用内置函数既能省时间,还能减少出错的概率。