PHP用什么函数可以实现数组去重

那天,我在一家咖啡馆帮一个朋友调试他的 PHP 代码。
她使用 array_unique() 来处理用户输入的数组。
结果我的钥匙全乱了,我急得直跺脚。
我说这个功能很强大,但是要看你在什么环境下使用。

例如,如果您有多个用户 ID,所有这些 ID 都是数字 [1 , 2 , 2 , 3 ],那么使用 array_unique() 就非常有意义。
[1 ,2 ,3 ],保留最先出现的键。
没问题。
但是当 ['id' => 1 , 'name' => 'Alice', 'id' => 2 ] 时使用 array_unique() 是愚蠢的。
如果只查看值,结果将是 ['id' => 1 , 'name' => 'Alice'],这可能会导致失去第二个用户。
这时候就需要用array_flip() + array_keys()像解方程一样进行反转,然后反转将重复的值挤出来,但前提是该值不能重复,例如['id' => 1 , 'id' => 2 ],所以就出现了波纹。

最头疼的是对象数组。
例如,如果存储多个User对象$users = [new User(1 ), new User(1 ), new User(2 )],直接array_unique()会报错,因为对象无法进行比较。
目前,你只能直接使用SplObjectStorage,它有自己的重复数据删除功能,就像智能​​垃圾收集站一样,或者编写自定义函数并使用spl_object_hash()为每个对象赋予唯一的标签,就像为产品附加条形码一样。
但是,这可能会使您的代码变得复杂并导致意外的挫折,就像穿过迷宫一样。

当数据量非常大时,array_unique() 会变得很慢。
您必须使用哈希表并自己编写函数。
像搭积木一样组装它。
就像在高速公路上修理汽车一样,它高效但容易出错。
我记得上次我帮助一家公司处理 1 00,000 行日志的数组以进行重复数据删除。
SplObjectStorage 版本比 array_unique() 快 5 倍,但我的同事不理解它,所以我最终将其改回 array_unique() + usort()。
虽然很慢,但至少是可行的。

等一下,还有一个问题。
有时,用户输入的数组具有重复键,例如 ['name' => 'Alice', 'age' => 2 5 , 'name' => 'Bob']。
这种 array_unique() 会保留第一个“名字”,但保留哪个键就看运气了。
此时,您可以使用 array_key_unique() (没有用于此目的的函数,但您可以编写自己的函数来检查重复的键),或者您可以在每个位置只放置一本书,就好像每次遍历自己组织书架一样,最好将重复的书扔进垃圾桶。

简单来说,删除 PHP 数组的重复数据就像做饭一样。
简单的菜肴只需要调料,复杂的菜肴则需要刀工。
想一想。
如果数组和嵌套数组中有对象,删除重复项就像在厨房切洋葱和煮洋葱一样,如果摇动手就会受伤。
所以,不要正面对待它,因为你选择的方法将取决于具体情况。

现在想一想,如果我们能够自动检测数组类型并智能选择复制方法,那就容易多了。
不过好像没有这样的功能,所以你得自己想办法实现。
有时编程就像过简单的生活。
在变得复杂之前,很难过上简单的生活。

如何在PHP中获取数组的长度?使用count()或sizeof()函数

说实话,对于PHP中数组的长度,可以使用count()或者sizeof(),没有什么区别。
但 count() 似乎更容易接受。
下面我就来给大家详细讲解一下如何使用。

1 .基本使用 PHP $fruits = ['苹果', '香蕉', '橙子']; echo_number($水果); // 输出 3
php $colors = ['红色', '绿色']; 回声大小($颜色); // 输出2
看,效果是一样的。
sizeof实际上是数字的别名,没有什么不同。

2 主要区别以及选择哪一个 这两个函数在 PHP 中的实现方式相同,并且运行速度相同。
主要还是看个人习惯。
不过说实话,count()看起来就是计数,所以用起来顺手。
如果您认为 sizeof() 与 C 中的相同,那也没关系。

我建议你为每个项目选择一个,不要混合使用,否则你在看代码时会和其他的混淆。

3 私人场景 空数组肯定会返回0,这是正常的。
PHP $emptyArray = []; echo_count($emptyArray); //输出0
非数组很烦人。
null 返回 0。
所有数字、字符串和对象都算作单个元素,返回 1 PHP 回声计数(空); // 输出0 回声计数(1 2 3 ); // 输出1 回显计数('你好'); // 输出 1
Class MyObject {} $obj = new MyObject(); 回显计数($obj); //如果输出对象1
,如果没有实现countable接口,则按照默认规则返回1 实施后,您可以使用自己的自定义计数方法。

在使用count之前,最好检查一下是否是数组,否则很容易出错。
PHP $maybeArray = "字符串"; 如果 (is_array($maybeArray)) { echo_count($maybeArray); }其他{ echo "该变量不是数组"; // 输出:变量不是数组
4 . 提高绩效 不要在循环中一直调用 count()。
每次都要重新计算,速度很慢。
最好先记住长度。
PHP $largeArray = 范围(0, 1 000000); // 慢:每次迭代都会计算长度 for ($i = 0; $i < count>//快速:先存储长度 $arrayLength = 计数($largeArray); for ($i = 0; $i < $arrayLength; $i++) {}
如果自定义对象想要使用 count(),它必须实现 Countable 接口。
PHP MyCollection 类实现 Countable { 私有$items = []; 公共函数添加($元素){ $this->items[] = $item; } 公共函数计数(){ 返回数字($this->items); }
$collection = new MyCollection(); $collection->add('A'); echoCount($集合); // 输出1
不要让数组操作太复杂,减少不必要的中间数组。

5 总结 最好使用 count(),这很好。
在使用非数组变量之前检查它们。
如果性能敏感,请存储长度推进、使用可数接口并优化数据流。
团队应该统一使用count()或sizeof(),而不是混合使用。