2013-05-07 114 views
0

可有人請向我解釋什麼這兩個函數的區別是:區別:array_diff_ukey和array_diff_uassoc

array_diff_ukey 
array_diff_uassoc 

他們都需要鑰匙進入比較功能,以及基於這些鍵決定是否數組元素應該退還或不。我檢查的PHP手冊,但對我來說,他們似乎都在做同樣的事情...

+1

那麼,根據手冊'array_diff_uassoc' *「計算* ***附加索引檢查*** *」的數組的差異,其中'array_diff_ukey'沒有。 – Kermit 2013-05-07 17:46:27

+0

似乎是一個文檔問題,因爲'uassoc'的回調是比較* values *而不是* keys *。 – 2013-05-07 18:00:31

回答

2

array_diff_ukey返回所述第一陣列,其鍵比較所述第二陣列中的所有密鑰(的語義不同的那些元件該比較是用戶定義的)。與這些鍵相關的值不起作用。

array_diff_uassoc在於還檢查值以上的一個「更包含性的」版本:如果所述第一陣列中的一個關鍵比較等於按鍵上的第二陣列中但這些值是不同的,該元件也包括在結果。在這種情況下,值的比較不是用戶定義的,但是與array_diff一樣:對於要比較的兩個值相等,它們的字符串表示形式必須相同。

實施例,改編自PHP文檔:

function key_compare_func($key1, $key2) 
{ 
    if ($key1 == $key2) 
     return 0; 
    else if ($key1 > $key2) 
     return 1; 
    else 
     return -1; 
} 

$array1 = array('blue' => 1, 'red' => 2, 'green' => "3", 'purple' => 4); 
$array2 = array('green' => 3, 'blue' => 6, 'yellow' => 7, 'cyan' => 8); 

var_dump(array_diff_ukey($array1, $array2, 'key_compare_func')); 
var_dump(array_diff_uassoc($array1, $array2, 'key_compare_func')); 

See it in action

這裏,array_diff_ukey將返回$array1中的「紅色」和「紫色」元素,因爲這些鍵不會與$array2中的任何鍵相等。但是array_diff_uassoc也會返回「藍色」元素,因爲即使該關鍵字在兩個數組中都存在,關聯的值也是不同的。

請注意,儘管關聯的值是$array1中的字符串和$array2中的整數,但兩個結果中都不包含「綠色」元素。

1

從手冊:

array_diff — Computes the difference of arrays 
array_diff_key — array_diff_key — Computes the difference of arrays using keys for comparison 
array_diff_assoc — Computes the difference of arrays with additional index check 

索引檢查意味着不僅價值必須是一樣的,但關鍵也必須是一樣的。所以array_diff_ukeyarray_diff_uassoc之間的區別是後者檢查鍵和值,而第一個只檢查鍵。

diff_之後添加u意味着您必須提供自定義回調函數,而不是默認的內置函數。基於手動上

實施例(Fiddle

<?php 
header("Content-Type: text/plain"); 
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'black' => 0, 'purple' => 4); 
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8, 'black' => 0); 

var_dump(array_diff($array1, $array2)); 
var_dump(array_diff_key($array1, $array2)); 
var_dump(array_diff_assoc($array1, $array2)); 
?> 

輸出

array(4) { 
    ["blue"]=> 
    int(1) 
    ["red"]=> 
    int(2) 
    ["green"]=> 
    int(3) 
    ["purple"]=> 
    int(4) 
} 
array(2) { 
    ["red"]=> 
    int(2) 
    ["purple"]=> 
    int(4) 
} 
    array(4) { 
     ["blue"]=> 
    int(1) 
    ["red"]=> 
    int(2) 
    ["green"]=> 
    int(3) 
    ["purple"]=> 
    int(4) 
} 
+0

這是不正確的。它也會輸出「藍色」和「綠色」,不是因爲索引不同,而是因爲*值*不同。看到我的答案。 – Jon 2013-05-07 18:10:36

+0

你是對的,更新了答案 – dtech 2013-05-07 18:47:33