array_uintersect中的错误?

时间:2011-11-18 01:55:23

标签: php arrays

<?

function filterIdenticalEntriesCallback($a, $b) {
    echo "<tr><td>{$a['file']}</td><td>{$b['file']}</td><td>{$a['md5']}</td><td>{$b['md5']}</td></tr>";
    if ( (strcmp($a['file'], $b['file']) == 0 ) && ( strcmp($a['md5'],$b['md5']) == 0)){ 
        return 0;
    }
    return 1;
}

$vieja = array(
        array('file' => 'a', 'md5' => '1'),     //cambia
        array('file' => 'b', 'md5' => '2'),     //igual
        array('file' => 'c', 'md5' => '3'),     //igual
        array('file' => 'd', 'md5' => '4'),     //igual
);

$nueva = array(
        array('file' => 'a', 'md5' => '2'),     //cambia
        array('file' => 'b', 'md5' => '2'),     //igual
        array('file' => 'c', 'md5' => '3'),     //igual
        array('file' => 'd', 'md5' => '4'),     //igual
);

echo "<table>";
$ignorar = array_uintersect($nueva, $vieja, 'filterIdenticalEntriesCallback');
echo "</table>";

echo "<pre>";
print_r($ignorar);
echo "</pre>";
?>

输出

b   a   2   2
b   c   2   3
d   b   4   2
a   c   2   3
b   a   2   1
b   c   2   3
d   b   4   2
a   c   1   3
c   c   3   3
c   a   3   2
a   a   2   1
a   b   2   2
a   d   2   4
Array
(
    [2] => Array
        (
            [file] => c
            [md5] => 3
        )

)

我无法理解为什么这段代码不会产生正确的输出,这个输出应该是带有“B”,“C”和“D”元素的数组,因为只有“A”元素不同于$ vieja到$ nueva。 ..

如果我将“A”元素都等于输出就可以了....

编辑:

function filterIdenticalEntriesCallback($a, $b) {
echo "<tr><td>{$a['file']}</td><td>{$b['file']}</td><td>{$a['md5']}</td><td>{$b['md5']}</td></tr>";
if (strcmp($a['file'], $b['file']) == 0 ){ 
    if ( strcmp($a['md5'],$b['md5']) == 0)
        return 0;
    else return 1;
} else return -1;

}

使用此回调工作正常,但我仍然不明白为什么... -1和1回调结果对函数意味着什么?我的意思是,我只需要相同的值...当回调返回0时......我不需要其他情况...

2 个答案:

答案 0 :(得分:3)

适用于我的过滤器:

function filterIdenticalEntriesCallback($a, $b) {
        $cmp = strcmp($a['file'], $b['file']);
        if($cmp==0) {
                return strcmp($a['md5'], $b['md5']);
        } else {
                return $cmp;
        }
}

由于交叉方式在内部起作用,如果第一个小于第二个,则必须返回负数,如果它们相同则必须返回0,如果第一个大于第二个,则必须返回正数。 This has been observed before by nate


更整洁的过滤功能:

function filterIdenticalEntriesCallback($a, $b) {
        if ($a==$b) {
                return 0;
        } else {
                return $a<$b ? -1 : 1;
        }
}

这是因为PHP进行比较的方式。理论上,这个比较函数适用于任何两个相同类型的对象,您希望确保所有属性及其值相同。

或者与单个班轮相同:

function filterIdenticalEntriesCallback($a, $b) {
        return $a == $b ? 0 : ($a < $b ? -1 : 1);
}

答案 1 :(得分:2)

PHP documentation中的注释表示您不能只返回0和1,但您必须在适当的时候返回-1。如果你有一个返回-1的情况,你可能会有更好的运气。