Nesneler için array_unique gibi bir yöntem var mı? Ben birleştirme, ve sonra ben çiftleri çıkarmak istiyorum 'Rol' nesnelerle diziler bir grup var :)
Teşekkürler
Peki array_unique()
a> elemanlarının dize değerini karşılaştırır:
Not: İki unsurları eğer ve sadece eğer eşit kabul edilir
(string) $elem1 === (string) $elem2
. Deyişle: dize gösterimini aynı olduğunda. Birinci eleman kullanılacaktır.
Yani sınıfta __toString()
a> yöntemi uygulamak için emin olun ve eşit roller için aynı değeri verir ki, örneğin
class Role {
private $name;
//.....
public function __toString() {
return $this->name
}
}
Onlar aynı adı varsa, bu eşit olarak iki rol düşünecektim.
Ben kabul edilen bir cevabı zaten var biliyorum, ama burada bir alternatiftir.
Önceki yanıtta aksine, PHP 5 comparing objects doğası beri in_array()
kullanır bize bunu sağlar. Bu nesne karşılaştırma davranış yararlanarak dizisi only nesneleri içeren gerektirir, ancak burada durum gibi görünüyor.
$merged = array_merge($arr, $arr2);
$final = array();
foreach ($merged as $current) {
if ( ! in_array($current, $final)) {
$final[] = $current;
}
}
var_dump($final);
Veya:
<?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);
?>
array_unique
kullanarak nesneleri bir dizi ile çalışır SORT_REGULAR
strong>:
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));
Basacaktır:
Array (
[0] => MyClass Object
(
[prop] => test1
)
[2] => MyClass Object
(
[prop] => test2
)
)
Burada eylem görmek: http://3v4l.org/VvonH#v529
Warning: o "==" karşılaştırma değil, sıkı bir karşılaştırma ("===") kullanacaktır.
Nesnelerin bir dizinin içindeki çiftleri kaldırmak istiyorsanız Yani, nesne kimliği (örneği) karşılaştırmak değil, her nesnenin özelliklerini karşılaştırmak olacaktır sakının.
Burada: http://php.net/manual/en/function.array-unique.php#75307
Bu bir de nesneler ve diziler ile çalışmak istiyorum.
<?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);
}
?>
bir dize elemanları döküm ve bir karşılaştırma yaparak çalışmalarını array_unique. Lütfen nesneleri benzersiz dizeler döküm sürece, o zaman array_unique ile çalışmaz.
Bunun yerine, nesneler için durumsal bir karşılaştırma işlevi uygulamak ve array_filter fonksiyonu zaten gördü şeyleri dışarı atmak için kullanın.