1

array_uintersect()2 つの多次元配列間の行を比較する際に、2 つの要素の文字列を大文字と小文字を区別して比較する必要があるため、呼び出しにカスタム コールバックがあります。

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
        )

)

「A」要素のみが $vieja と $nueva で異なるため、このコードが「B」、「C」、「D」要素の配列であるはずの正しい出力を生成しない理由がわかりません。 .

両方の「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を返すときです...他のケースは必要ありません...

4

3 に答える 3

3

私のために働くフィルター:

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

交差が内部的に機能する方法のため、最初の数値が2番目の数値よりも小さい場合は負の数、同じである場合は0、最初の数値が2番目の数値より大きい場合は正の数を返す必要があります。 これは、以前にnateによって観察されました


きちんとしたフィルター機能:

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

これは、PHPが比較する方法のために機能します。理論的には、この比較関数は、すべての属性とその値が同じであることを確認したい、同じタイプの2つのオブジェクトに対して機能します。

または、ワンライナーと同じもの:

function filterIdenticalEntriesCallback($a, $b) {
        return $a == $b ? 0 : ($a < $b ? -1 : 1);
}
于 2011-11-18T02:10:26.847 に答える