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抛出函数已经看到的东西。