2014-01-13 23 views
6

2天前,我問了這個問題(I am confused on the issue,how to use array_udiff)。
我很抱歉再次討論這個問題。
雖然我已經得到了解決問題的方法,但我對這個問題仍然感到困惑:
demo1的:關於array_udiff,我想再問一次

function myfunction($v1,$v2) 
{ 
if ($v1===$v2) 
    { 
    return 0; 
    } 
return 1; 
} 
$a1=array("a"=>"Cat","b"=>"Dog","c"=>"Horse"); 
$a2=array(1=>"Cat",2=>"Dog",3=>"Fish"); 
print_r(array_udiff($a1,$a2,"myfunction")); 

輸出:

Array ([c] => Horse) 

DEMO2:

function myfunction($v1,$v2) 
{ 
if ($v1===$v2) 
    { 
    return 0; 
    } 
return 1; 
} 
$a1 = array(1,2,3,4,5); 
$a2 = array(1,6,3,4,5); 
print_r(array_udiff($a1,$a2,"myfunction")); 

我預計這會返回:

Array ([0] => 2) 

但輸出是:

Array ([0] => 1 [1] => 2 [2] => 3 [4] => 5) 

是的,我知道,我需要根據PHP手冊,
demo3:

function myfunction($v1,$v2) { 
    if ($v1 < $v2) { 
     return -1; 
    } elseif ($v1 > $v2) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 
$a1 = array(1,2,3,4,5); 
$a2 = array(1,6,3,4,5); 
print_r(array_udiff($a1,$a2,"myfunction")); 

輸出:

Array ([1] => 2)// it's right 

我感到困惑的是,爲什麼demo1沒問題。

+0

您期望使用回調函數的輸出是什麼? – tlenss

回答

6

您得到的結果是因爲您使用的回調函數返回10。雖然在邏輯上它是合理的(即1意味着「平等」和0表示「不等於」) - PHP預計回調返回全面的比較 - 因此,不僅對平等 - 也大於和小於比較。

要理解它的原因,您需要了解PHP如何處理數組差異的計算。這不僅僅是簡單地通過兩個陣列。 PHP將排序數組,然後將做檢查。這是因爲簡單的步驟(嵌套循環)將導致複雜性,而排序陣列首先會導致大小爲nm的兩個陣列的大約O(k log(k)), k=max(n, m)複雜度。並通過用戶定義的回調排序元素不夠檢查元素相等。你需要知道他們的訂單,這就是爲什麼少/更多比較是必要的。

因此,作爲結論:您只能在結果中使用完整-1/0/1值的回調。如果你的回調返回不同的東西,結果將是不可預知的 - 這就是爲什麼它們可能是「正確」「錯誤」對不同的輸入數據。

+1

太複雜了! – ZhouMengkang