2013-05-07 111 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