1

我有以下 PHP 脚本:

<?php
function filt($k, $l){
    if($k===$l){
        var_dump("valid: ".$k."-".$l);
        return 0;
    }
    return 1;
}
$a6=array(7, 9, 3, 33);
$a7=array(2, 9, 3, 33);
$u=array_udiff($a6, $a7, "filt");
var_dump($u);
?>

使用以下输出:

string 'valid: 3-3' (length=10)

array
    0 => int 7
    1 => int 9
    3 => int 33

据我所知,array_udiff 应该转储相等的值,只让第一个数组中的不同值。这里似乎有什么问题?我在 Windows 7 上运行 WampServer 版本 2.2。PHP 版本:5.3.9。

4

2 回答 2

4

请注意,文档说:

The comparison 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.

你不这样做。为了确保你这样做,只需让你的filt函数返回$l - $k

对此有一个简单的解释:元素可能按任何顺序排列。为了避免必须将每个元素与其他元素进行比较,它首先对它们进行排序。这就是为什么你需要 + / 0 / -

于 2012-07-10T09:53:24.280 回答
3

您没有返回所有必要的值(例如 -1、0、1)。请参阅:array_udiff

$a6 = array(7, 9, 3, 33);
$a7 = array(2, 9, 3, 33);

$u = array_udiff($a6, $a7, function ($k, $l){
  return $k > $l ? 1 : ($k < $l ? -1 : 0);
});

print_r($u);
于 2012-07-10T09:52:54.420 回答