为什么当回调返回布尔值时,array_udiff()会返回错误的结果?

问题描述 投票:0回答:1

我很难理解

array_udiff
的工作原理。

根据文档

array_udiff ($array1, $array2, data_compare_func)

[...]

data_compare_func
如果第一个参数被认为分别小于、等于或大于第二个参数,则函数必须返回小于、等于或大于零的整数。

所以考虑这个功能:

function please_compare($a, $b) {
  return $a !== $b;
};

如果 $a 等于 $b,该方法将返回 0,否则返回 1(因为 this)。

(这里没有返回-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
     )
*/
php arrays compare array-difference
1个回答
6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.