nesneler için array_unique?

7 Cevap php

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

7 Cevap

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);

array_unique for objects?

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 :

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.

Ayrıca, önce serialize:

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

PHP gibi sadece kullanabilirsiniz 5.2.9 isteğe bağlı sort_flag SORT_REGULAR:

$unique = array_unique( $array, SORT_REGULAR );

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.