函数之间的区别:array_diff_ukey和array_diff_uassoc

时间:2013-05-07 17:45:05

标签: php arrays

有人可以向我解释这两个功能之间的区别:

array_diff_ukey
array_diff_uassoc

它们都将键带入compare函数,并根据这些键决定是否应该返回数组元素。我已经检查了php手册,但对我来说,他们似乎都在做同样的事情......

2 个答案:

答案 0 :(得分: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也将返回“blue”元素,因为即使该键存在于两个数组中,关联的值也不同。

请注意,“green”元素不包含在任何一个结果中,尽管相关值是$array1中的字符串和$array2中的整数。

答案 1 :(得分: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之间的区别在于后者检查键和值,而第一个只检查键。

u之后添加diff_意味着您必须提供自定义回调函数,而不是默认的内置函数。

基于手册(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)
}