array_udiff(),array_uintersect()等如何工作?

时间:2016-05-12 05:54:38

标签: php arrays anonymous-function

这里有几个类似的问题,但我还没有找到答案。

PHP手册说明了

  

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

问题是我不明白为什么有三个可选结果如-101这么重要?如果我将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比较生成错误的数组。

为什么它会那样工作?

感谢。

1 个答案:

答案 0 :(得分:0)

array_udiff_assoc()将使用内置函数比较键,并使用用户定义的函数比较值。

array_udiff_assoc($array1,$array2,"userDefinedFunction");

所以无论结果如何。将自动调用用户定义的函数以比较数组值。如果您不想打电话给您的比较选项&#39;函数,然后你可以去 array_diff_assoc($ array1,$ array2)。这将使用内置函数来比较数组的键和值。