- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
array_udiff
使用回调函数计算两个数组之间的差异。但是,它需要一个比较函数而不是谓词函数。
比较函数将项目 A 与项目 B 进行比较。谓词函数将仅确定项目 A 是否等于项目 B。
排序函数通常需要比较函数来确定正确的顺序。由于 array_udiff
只是计算差异,因此确定每对是否相等的谓词函数似乎就足够了。
为什么 array_udiff 使用比较函数而不是谓词函数?如果我改用谓词有关系吗?即我是否可以选择只使用 0
和 1
返回值来表示不平等和平等,而放弃 -1
可能性?这会对我的结果产生什么不利影响(如果有的话)?
最佳答案
php_array_diff() 的实现(它为许多用户空间数组函数提供实现)通过重用许多内部比较函数来工作。
这是因为那些比较函数已经存在用于其他目的,并且满足手头所需的任务:确定两个项目是否相等。他们做一点额外的工作并不重要;重要的是需要考虑的代码相对减少。 (一个等于函数可以很容易地写成一个比较函数,或者作为一个单独的实体,但现在你有两个函数来完成同样的工作。)
实际实现也可以通过 sorting 进行.所以需要使用适合排序的比较算法,不然会得到意想不到的结果。例如:
$a = [0, 1, 2, 3, 4, 5, 6];
$b = [4];
print_r(array_udiff($a, $b, function($x, $y) {
return $x <=> $y; //Sorting comparison function, correct
}));
print_r(array_udiff($a, $b, function($x, $y) {
return $x != $y; // Equality test, incorrect
}));
给予
Array //Sorting comparison function, correct
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[5] => 5
[6] => 6
)
Array // Equality test, incorrect
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4 // equality test causes udiff to incorrectly include 4
[5] => 5
[6] => 6
)
这是因为 php_array_diff() 使用的算法。基本上它是这样的:
因此,该算法依赖于所有正在排序的输入,并使用该事实(以及比较函数),因此它只需检查每个输入数组中的每个元素一次。如果比较函数没有生成实际排序的数组,则算法失败,您会得到不好的结果。
HHVM 可能会产生不同的结果,因为 HHVM 使用不同的排序算法。 HHVM 使用 pure quicksort ,而 PHP 使用 quicksort implementation derived from llvm其中包括插入排序优化。
通常情况下,不同的排序算法会通过不同的方式得出相同的解决方案。也就是说,不同的算法会导致元素以不同的顺序、不同的时间和不同的数量进行比较。如果比较函数不正确,这会对数组的最终顺序产生很大影响。
关于php - 为什么 array_udiff 使用比较函数而不是谓词函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34749078/
我正在尝试将两个数组与 array_udiff 进行比较,但这很奇怪。似乎 array_udiff 没有得到正确的答案。这里是 live demo .结果应该是一个空数组,但不过滤掉一个元素。
我有这段代码来获取两个对象数组之间的差异: $diff = array_udiff($a, $b, function($obj_a, $obj_b) { return $obj
array_udiff使用回调函数计算两个数组之间的差异。但是,它需要一个比较函数而不是谓词函数。 比较函数将项目 A 与项目 B 进行比较。谓词函数将仅确定项目 A 是否等于项目 B。 排序函数通常
数组 1:$tags_result array (size=4) 0 => object(stdClass)[8] public 'id_tag' => string
我无法理解 array_udiff 的工作原理。 根据documentation : array_udiff ($array1, $array2, data_compare_func) [...] d
我是一名优秀的程序员,十分优秀!