2012-04-22 17 views
1

下面的代碼,這是非常簡單的:array_udiff()如何工作?

<?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 
+0

通過不回傳任何來自回調​​的負值,您將混淆比較。它應該根據[array_udiff](http://php.net/array_udiff)文檔返回pos/zero/neg。如果你想弄清楚操作特性,你應該看一下PHP源代碼來獲得'官方'的字眼。 – 2012-04-22 20:16:43

+0

我在問這個問題,因爲我想讓人們(比如我)更快地完成工作,這要歸功於stackoverflow。這意味着避免查看PHP源代碼來獲取「官方」字,並詢問這裏的某個人是否願意分享他/她的知識。 – 2012-04-22 20:21:15

+0

雖然您可以添加評論作爲答案,並修改我的代碼以使其更「合乎邏輯」。那樣會很親切。 – 2012-04-22 20:22:01

回答

0

array_udiff()實際產生的結果的方式是當然的實現細節,並隨時可能更改。所以儘管我說的話現在可能是真的,但是你不能依賴它。例如,如果您需要使用舊版本的PHP,則可以實現該函數的兼容版本,該版本將第一個數組的每個元素與第二個數組的每個元素進行比較,放棄所有匹配的元素。另一方面,如果您希望得到最高的性能,您可以快速排序第二個數組的元素,然後執行第一個數組元素的二進制搜索。

PHP 5.3似乎將快速排序和線性搜索結合起來。但是,一旦找到更大的元素,它會中止搜索。

+0

因此,在我的示例中,我該如何比較對象及其屬性? – 2012-04-22 20:36:11

+0

==應該足以比較對象,就像我在另一個問題中給出的示例一樣。儘管如果你的對象比擁有公共屬性的結構更復雜,你應該考慮這個複雜性。查看示例http://tehplayground.com/#GyUaoV1Cy – alganet 2012-04-22 20:48:05