Почему array_udiff возвращает общие элементы?

Как должен использоваться 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 не дает такой же вывод?

1

Решение

Вывод правильный, если вы посмотрите на руководство, вы увидите, почему и как оно работает: http://php.net/manual/en/function.array-udiff.php

И цитата оттуда:

Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.

0

Другие решения

Год спустя … Но с 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 было бы логично попытаться выиграть время таким образом!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector