对象的 array_unique ?
是否有类似对象的 array_unique 的方法?我有一堆带有“角色”对象的数组,我将其合并,然后我想取出重复项:)
Is there any method like the array_unique for objects? I have a bunch of arrays with 'Role' objects that I merge, and then I want to take out the duplicates :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
array_unique
适用于数组使用SORT_REGULAR
的对象:将打印:
在此处查看实际操作:http://3v4l .org/VvonH#v529
警告:它将使用“==”比较,而不是严格比较(“===”)。
因此,如果您想删除对象数组中的重复项,请注意它将比较每个对象属性,而不是比较对象标识(实例)。
array_unique
works with an array of objects usingSORT_REGULAR
:Will print:
See it in action here: http://3v4l.org/VvonH#v529
Warning: it will use the "==" comparison, not the strict comparison ("===").
So if you want to remove duplicates inside an array of objects, beware that it will compare each object properties, not compare object identity (instance).
好吧,
array_unique()
比较字符串元素的值:因此,请确保实现
__toString()
方法在您的类中,并且它为相同的角色输出相同的值,例如,如果两个角色具有相同的名称,则这会将它们视为相同。
Well,
array_unique()
compares the string value of the elements:So make sure to implement the
__toString()
method in your class and that it outputs the same value for equal roles, e.g.This would consider two roles as equal if they have the same name.
由于 PHP 中比较对象的本质,此答案使用
in_array()
5 允许我们这样做。利用此对象比较行为要求数组仅包含对象,但这里似乎就是这种情况。This answer uses
in_array()
since the nature of comparing objects in PHP 5 allows us to do so. Making use of this object comparison behaviour requires that the array only contain objects, but that appears to be the case here.以下是删除数组中重复对象的方法:
Here is a way to remove duplicated objects in an array:
您也可以先序列化:
从 PHP 5.2.9 开始,您可以仅使用可选的
sort_flag SORT_REGULAR
:You can also serialize first:
As of PHP 5.2.9 you can just use optional
sort_flag SORT_REGULAR
:如果您想根据特定属性过滤对象,还可以使用 array_filter 函数:
You can also use they array_filter function, if you want to filter objects based on a specific attribute:
从这里: http://php.net/manual/en/function.array-unique.php #75307
这也适用于对象和数组。
From here: http://php.net/manual/en/function.array-unique.php#75307
This one would work with objects and arrays also.
如果您需要从数组中过滤重复的实例(即“===”比较)并且:
的对象,那么明智且快速的方法是:
sane and fast way if you need to filter duplicated instances (i.e. "===" comparison) out of array and:
is:
如果您有一个对象的索引数组,并且想要通过比较每个对象中的特定属性来删除重复项,则可以使用类似下面的
remove_duplicate_models()
的函数。结果是:
If you have an indexed array of objects, and you want to remove duplicates by comparing a specific property in each object, a function like the
remove_duplicate_models()
one below can be used.The result is:
这是非常简单的解决方案:
This is very simple solution:
您还可以使用回调函数使数组唯一(例如,如果您想比较对象的属性或任何方法)。
这是我用于此目的的通用函数:
示例用法:
You can also make the array unique using a callback function (e.g. if you want to compare a property of the object or whatever method).
This is the generic function I use for this purpose:
Sample usage:
用于严格 (
===
) 比较的array_unique
版本,保留键:用法:
array_unique
version for strict (===
) comparison, preserving keys:Usage:
array_unique 的工作原理是将元素转换为字符串并进行比较。除非您的对象唯一地转换为字符串,否则它们将无法与 array_unique 一起使用。
相反,为您的对象实现有状态比较函数并使用 array_filter扔掉函数已经看到的东西。
array_unique works by casting the elements to a string and doing a comparison. Unless your objects uniquely cast to strings, then they won't work with array_unique.
Instead, implement a stateful comparison function for your objects and use array_filter to throw out things the function has already seen.
这是我比较具有简单属性的对象的方式,同时接收唯一的集合:
将输出:
This is my way of comparing objects with simple properties, and at the same time receiving a unique collection:
Will output:
如果您有对象数组并且想要过滤此集合以删除所有重复项,您可以将 array_filter 与匿名函数一起使用:
重要: 请记住,您必须将
$tmp
数组传递为引用你的过滤器回调函数,否则它将不起作用If you have array of objects and you want to filter this collection to remove all duplicates you can use array_filter with anonymous function:
Important: Remember that you must pass
$tmp
array as reference to you filter callback function otherwise it will not work