这里有几个类似的问题,但我还没有找到答案。
PHP手册说明了
比较函数必须返回小于,等于或的整数 如果第一个参数被认为是大于零 分别小于,等于或大于第二个。
问题是我不明白为什么有三个可选结果如-1
,0
和1
这么重要?如果我将0
用于比较两个值相等的情况,那么为什么不能解决呢?
一个更实际的问题:我有一个任务,我应该找到第二个数组中存在的第一个数组的元素。数组的结构是相同的,如下所示:
Array
(
[0] => Array
(
[productId] => 5479046275
[options] => Array
(
[1] => All
[2] => Green
)
)
)
因此,当productId
值匹配时,我认为此类数组的元素相等,并且当关键字的选项之间没有区别时。应该使用“所有”选项与其他值相匹配的事实来执行比较选项。所以我有这样的代码:
$cartItems = <MyArray>;
$triggers = <MyAnotherArray>;
/**
* Options equal each other when they are exactly the same or
* when bundle offer's product has 'All' selected as option.
*/
$compareOptions = function ($a, $b) {
if ('All' == $b) {
return 0;
}
return strcmp($a, $b);
};
/**
* Compare product id to make sure these variants are of the same product
* Then check the options. If there's no difference, then variants
* are equal
*/
$compareVariants = function ($a, $b) use ($compareOptions) {
if ($a['productId'] != $b['productId']) {
return ($a['productId'] > $b['productId']) ? 1 : -1;
}
$optionsDiff = array_udiff_assoc($a['options'], $b['options'], $compareOptions);
if (0 === count($optionsDiff)) {
return 0;
} else {
return (count($optionsDiff) > 0) ? 1 : -1;
}
};
return array_uintersect($cartItems, $triggers, $compareVariants);
然后我xDebugged它。出于某种原因,当$ optionsDiff为空且脚本返回0时,它不会退出$ compareVariants函数,而是转到$ compareOptions比较生成错误的数组。
为什么它会那样工作?
感谢。
答案 0 :(得分:0)
array_udiff_assoc()将使用内置函数比较键,并使用用户定义的函数比较值。
array_udiff_assoc($array1,$array2,"userDefinedFunction");
所以无论结果如何。将自动调用用户定义的函数以比较数组值。如果您不想打电话给您的比较选项&#39;函数,然后你可以去 array_diff_assoc($ array1,$ array2)。这将使用内置函数来比较数组的键和值。