Как должен использоваться array_udiff? Результаты следующего теста кажутся немного странными по сравнению с ожидаемым логическим результатом.
$a1 = array('red');
$a2 = array('red', 'blue');
$diff = array_udiff($a1, $a2,
function($a, $b) {
if($a === $b) {
return 0;
}
else {
return -1;
}
});
var_dump($diff);
Вышеуказанные выводы:
array (size=1)
0 => string 'red' (length=3)
Зачем?
Чтобы лучше показать проблему, вот вывод внутреннего массива array_diff:
$internalDiff = array_diff($a1, $a2);
var_dump($internalDiff);
Выход :
array (size=0)
empty
Какие???!!! (:)) . Второй вывод выглядит логичным, но почему array_udiff не дает такой же вывод?
Вывод правильный, если вы посмотрите на руководство, вы увидите, почему и как оно работает: http://php.net/manual/en/function.array-udiff.php
И цитата оттуда:
Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.
Год спустя … Но с array_udiff, я думаю, PHP будет думать, что если a> b и b> c, a! = C, то он будет действовать как a! = C, даже если a & с равны.
Используя array_udiff, вы действительно должны слушать документацию PHP и возвращать -1 и 1, в зависимости от случая, а не только -1 или 1, когда он не равен egal, иначе он не будет работать так, как вы ожидаете.
Я нашел этот пост, потому что у меня та же проблема, так же как и в Geo C, я не понимал, почему мой array_udiff возвращал общий элемент. Я всегда возвращал -1 (тогда я пытаюсь с 1), когда две записи не были равны, и теперь, когда я проверяю больше или меньше, это работает отлично!
И если подумать, для PHP было бы логично попытаться выиграть время таким образом!