PHP提供了一个闭包来确定数组中项的唯一性

时间:2010-08-27 21:00:03

标签: php closures unique

快速提问:有没有办法在PHP中提供一个与array_unique函数等效函数的闭包,以便在比较数组中的两个项时可以指定自己的比较闭包?我有一个类实例数组(可能包含重复项),并希望告诉PHP使用特定的逻辑来确定唯一性。

PHP使用usort()方法为此提供排序 - 只是想知道它是否也可用于唯一性检查。谢谢!

3 个答案:

答案 0 :(得分:1)

array_filter可以对数组中的每个元素应用回调,并返回true / false,表示是否将该值保留在返回的数组中。 Here is a comment使用array_filter删除数组中的重复项。

答案 1 :(得分:0)

我找不到你想要的东西,但我想也许写下你自己的功能并不太难......

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

)

答案 2 :(得分:0)

array_unique()的{​​{3}}没有提供回调版本的任何链接,左侧链接列表中没有一个名为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;
        }
    }
}