array_udiff()如何工作?

时间:2012-04-22 20:11:52

标签: php

这是代码,非常简单:

<?php
$tab = array (
    (object)array( 'id' => 1,),
    (object)array( 'id' => 4,),
    (object)array( 'id' => 12,),
    (object)array( 'id' => 22,),
    (object)array( 'id' => 25,),
);

$tab_json = array (
    (object)array( 'id' => 1,),
    (object)array( 'id' => 4,),
    (object)array( 'id' => 12,),
    (object)array( 'id' => 22,),
    (object)array( 'id' => 25,),
    (object)array( 'id' => 2,),
);
$difference = array_udiff($tab_json, $tab, function($a, $b) {
    echo $a->id." <-> ".$b->id."\n";
    return (count(array_diff_assoc(get_object_vars($a), get_object_vars($b))))>0;
});
?>

这是输出:

12 <-> 4
12 <-> 1
12 <-> 22
12 <-> 25
2 <-> 12
4 <-> 25
4 <-> 1
22 <-> 4
25 <-> 1
12 <-> 4
12 <-> 1
12 <-> 22
25 <-> 12
4 <-> 22
1 <-> 4
1 <-> 22
1 <-> 4
1 <-> 1
1 <-> 25
25 <-> 4
25 <-> 1
25 <-> 12
25 <-> 25
25 <-> 4
4 <-> 1
4 <-> 12
4 <-> 25
4 <-> 22
22 <-> 1
22 <-> 12
22 <-> 25
22 <-> 12
12 <-> 1
12 <-> 12
12 <-> 2
2 <-> 12
2 <-> 25

我不明白它是如何计算的:看看12:它的比较超过10次(而根据我的理解,它应该被比较不超过第二个数组的元素数) ,而且它与1进行了三次比较!

经过测试:

PHP 5.3.9
PHP 5.3.2-1ubuntu4.14

1 个答案:

答案 0 :(得分:0)

array_udiff()实际产生结果的方式当然是一个实现细节,可能会有所变化。因此,虽然我现在说的可能是真的,但你不能依赖它。

例如,如果您需要使用旧版本的PHP,您可能会实现该函数的兼容版本,该版本只是将第一个数组的每个元素与第二个数组的每个元素进行比较,并丢弃任何匹配项。< / p>

另一方面,如果您想获得最佳性能,则可以快速排序第二个数组的元素,然后对第一个数组的元素执行二进制搜索。

PHP 5.3似乎将快速排序与线性搜索相结合。然而,一旦找到更大的元素,它就会中止搜索。