array_unique的对象?

有没有像对象的array_unique方法? 我有一堆与我合并的“angular色”对象的数组,然后我想取出重复:)

那么, array_unique()比较元素的string值:

注意 :当且仅当(string) $elem1 === (string) $elem2时,两个元素被认为是相等的,即当string表示相同时,将使用第一个元素。

所以一定要在你的类中实现__toString()方法,并为相同的angular色输出相同的值,例如

 class Role { private $name; //..... public function __toString() { return $this->name; } } 

如果他们有相同的名字,这将认为两个angular色是平等的。

array_unique使用SORT_REGULAR对象的数组:

 class MyClass { public $prop; } $foo = new MyClass(); $foo->prop = 'test1'; $bar = $foo; $bam = new MyClass(); $bam->prop = 'test2'; $test = array($foo, $bar, $bam); print_r(array_unique($test, SORT_REGULAR)); 

将打印:

 Array ( [0] => MyClass Object ( [prop] => test1 ) [2] => MyClass Object ( [prop] => test2 ) ) 

在这里看到它的行动:http: //3v4l.org/VvonH#v529

警告 :它将使用“==”比较,而不是严格比较(“===”)。

所以如果你想删除对象数组中的重复项,请注意它会比较每个对象的属性,而不是比较对象的标识(实例)。

我知道已经有一个被接受的答案,但是这里有一个select。

与之前的答案相反,它使用in_array()因为在PHP 5中比较对象的性质使我们可以这样做。 利用这个对象的比较行为要求数组包含对象,但在这里就是这种情况。

 $merged = array_merge($arr, $arr2); $final = array(); foreach ($merged as $current) { if ( ! in_array($current, $final)) { $final[] = $current; } } var_dump($final); 

这是删除数组中重复对象的一种方法:

 <?php // Here is the array that you want to clean of duplicate elements. $array = getLotsOfObjects(); // Create a temporary array that will not contain any duplicate elements $new = array(); // Loop through all elements. serialize() is a string that will contain all properties // of the object and thus two objects with the same contents will have the same // serialized string. When a new element is added to the $new array that has the same // serialized value as the current one, then the old value will be overridden. foreach($array as $value) { $new[serialize($value)] = $value; } // Now $array contains all objects just once with their serialized version as string. // We don't care about the serialized version and just extract the values. $array = array_values($new); 

你也可以先序列化:

 $unique = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) ); 

从PHP 5.2.9开始,你可以使用可选的sort_flag SORT_REGULAR

 $unique = array_unique( $array, SORT_REGULAR ); 

从这里: http : //php.net/manual/en/function.array-unique.php#75307

这个可以和对象和数组一起工作。

 <?php function my_array_unique($array, $keep_key_assoc = false) { $duplicate_keys = array(); $tmp = array(); foreach ($array as $key=>$val) { // convert objects to arrays, in_array() does not support objects if (is_object($val)) $val = (array)$val; if (!in_array($val, $tmp)) $tmp[] = $val; else $duplicate_keys[] = $key; } foreach ($duplicate_keys as $key) unset($array[$key]); return $keep_key_assoc ? $array : array_values($array); } ?> 

你也可以使用他们的array_filter函数,如果你想过滤基于特定属性的对象:

 //filter duplicate objects $collection = array_filter($collection, function($obj) { static $idList = array(); if(in_array($obj->getId(),$idList)) { return false; } $idList []= $obj->getId(); return true; }); 

理性和快速的方式,如果你需要过滤重复的实例(即“===”比较)arrays和:

  • 你确定什么数组只包含对象
  • 你不需要保存密钥

是:

 //sample data $o1 = new stdClass; $o2 = new stdClass; $arr = [$o1,$o1,$o2]; //algorithm $unique = []; foreach($arr as $o){ $unique[spl_object_hash($o)]=$o; } $unique = array_values($unique);//optional - use if you want integer keys on output 

array_unique通过将元素转换为string并进行比较来工作。 除非你的对象唯一地转换为string,否则它们将不能用于array_unique。

相反,为你的对象实现一个有状态的比较函数,并使用array_filter抛出函数已经看到的东西。