误解array_udiff的行为

5

我不太理解array_udiff的工作原理。

根据文档

array_udiff ($array1, $array2, data_compare_func)

[...] data_compare_func function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

因此考虑这个函数:
function please_compare($a, $b) {
  return $a !== $b;
};

如果$a等于$b,该方法将返回0,否则返回1(因为这里的原因)。
(这里不会返回-1,我感觉解释来自此处,但我只能比较值是否不同,而不能比较哪个大于另一个。)
有人能解释一下以下代码片段中array_udiff的行为吗?我还包括了array_diff的输出,实际上这是我期望的行为?
$array1 = array('a', 'b', 'c', 'd');
$array2 = array('a', 'b', 'c');

print_r(array_udiff($array1, $array2, 'please_compare'));
/* Returns:
     Array
     (
       [0] => a
       [1] => b
       [3] => d
     )
*/

print_r(array_diff($array1, $array2));
/* Returns:
     Array
     (
       [3] => d
     )
*/
1个回答

6

array_udiff 依赖于比较函数返回适当的值,因为它会对数组元素进行排序。如果您在比较函数中添加一些输出,您将看到 array_udiff 首先确定两个数组的排序顺序,只有在完成此操作后才开始比较 array1 中的元素和 array2 中的元素。通过从比较函数返回 1,您告诉 array_udiff 'a' > 'b' 并且 'b' > 'a',以及所有其他元素在两个数组中都是如此。在您的特定情况下,这导致 array_udiff 认为 array1 中 所有 元素都大于 array2 中的 所有 元素,直到它最终比较 array1 中的 'c' 和 array2 中的 'c' 并从您的函数中得到 0(这就是为什么它在结果中留下了 'c')。请参见此 PHP fiddle,了解 array_udiff 的内部工作演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接