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