PHP, обеспечивающий замыкание для определения уникальности элемента в массиве - PullRequest
3 голосов
/ 28 августа 2010

Быстрый вопрос: есть ли способ обеспечить замыкание в PHP какой-либо эквивалентной функции для функции array_unique, чтобы можно было указать собственное замыкание сравнения, которое будет использоваться при сравнении двух элементов в массиве?У меня есть массив экземпляров классов (которые могут содержать дубликаты) и я хочу сказать PHP использовать определенную логику для определения уникальности.

PHP обеспечивает это сортировкой с использованием метода usort () - просто интереснодоступны для проверки уникальности.Спасибо!

Ответы [ 3 ]

1 голос
/ 28 августа 2010

существует array_filter , с помощью которого вы можете применить обратный вызов к каждому элементу в массиве и вернуть true / false, чтобы сохранить это значение в возвращаемом массиве. Вот комментарий , использующий array_filter для удаления дубликатов в массиве.

0 голосов
/ 28 августа 2010

Страница руководства для array_unique() не содержит ссылок на версию обратного вызова, и в списке ссылок слева нет функции с именем array_uunique() (вот чтотакая функция должна вызываться, если она следует соглашению об именах других функций сортировки массивов - но тогда PHP не очень надежен в отношении соглашений об именах функций).

Вы можете добавить эту функцию самостоятельно, используядвойной foreach цикл:

$uniqueness_fails = false;
foreach ( $myarray as $keyA => $valueA ) {
    foreach ( $myarray as $keyB => $valueB ) {
        if ( $keyA != $keyB and my_equality_function($valueA, $valueB) ) {
            $uniqueness_fails = true;
            break 2;
        }
    }
}
0 голосов
/ 28 августа 2010

Я не смог найти именно то, что вы ищете, но я подумал, может быть, было бы не сложно написать свою собственную функцию ...

$a = new StdClass;
$b = new StdClass;
$c = new StdClass;
$d = new StdClass;

$a->a = 1;
$b->a = 1;
$c->c = 1;
$d->c = 1;

$objects = array( $a,$b,$c,$d );

function custom_array_unique( array $objects ) {

    foreach( $objects as $k =>$object ) {
        foreach( $objects as $k2 => $object2 ) {

            if ( $k !== $k2 && $object == $object2 ) {
                unset( $objects[$k] );
            }

        }
    }
    return $objects;
}

print_r( custom_array_unique($objects));


Array
(
    [1] => stdClass Object
        (
            [a] => 1
        )

    [3] => stdClass Object
        (
            [c] => 1
        )

)
...