Я пытаюсь сравнить два массива, $a
а также $b
и нужно их пересечение.
$a = [
['min' => 23 , 'max' => 987 , 'vmin' => 78],
['min' => 3 , 'max' => 87 , 'vmin' => 8],
['min' => 'faryaad' , 'max' => 987 , 'vmin' => 65]
];
$b = [
['min' => 23 , 'max' => 987 , 'vmin' => 78],
['min' => 'faryaad' , 'max' => 87 , 'vmin' => 8],
['min' => 203 , 'max' => 9807 , 'vmin' => 780]
];
$i = array_uintersect($a,$b,"comp");
function comp($val1,$val2) {
return $val1['min'] == $val2['min'] && $val1['max'] == $val2['max'] && $val1['vmin'] == $val2['vmin'] ;
}
print_r($i);
echo "<br />";
echo count($i);
В двух массивах есть одна общая вещь: ['min' => 23 , 'max' => 987 , 'vmin' => 78]
и я ожидаю, что результат отразит эту вещь. Но вместо этого результат:
Array ( [0] => Array ( [min] => 23 [max] => 987 [vmin] => 78 ) [1] =>
Array ( [min] => 3 [max] => 87 [vmin] => 8 ) [2] => Array ( [min] =>
faryaad [max] => 987 [vmin] => 65 ) )
3
Он просто возвращает весь массив $a
, Почему это так?
Функция сравнения не должна возвращать истину (если она равна) и ложь (если она отличается), а число со знаком, как указано в PHP документация:
Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.
Поскольку функция сравнения вызывается только для некоторых пар, достаточных для определения порядка, важно возвращать правильное значение, а не только 1, когда два значения различны. Это необходимо, так как иначе PHP может сделать неправильные выводы и сказать: так как < б а также б < с, никогда не может быть равным с, поэтому я не буду вызывать функцию сравнения для а также с.
Вот функция сравнения, которая дает правильные результаты:
$i = array_uintersect($a,$b,function($val1,$val2) {
foreach ($val1 as $k => $v) {
if(!isset($val2[$k])) return -1;
if ($res = strcmp($v, $val2[$k])) break;
}
return $res;
});
Смотрите, это работает на eval.in с некоторыми другими данными.
Выход для данных в вопросе:
Array (
[0] => Array (
[min] => 23
[max] => 987
[vmin] => 78
)
)
От array_uintersect документация:
Функция сравнения должна возвращать целое число меньше, равно или
больше нуля, если первый аргумент считается
соответственно меньше, равно или больше второго.
Вы возвращаете логическое значение true
если равно, что в int 1
, Один грязный взлом будет возвращаться false
, который был бы 0
в int
, означая равный в функции сравнения.
function comp($val1,$val2) {
return !($val1['min'] == $val2['min'] && $val1['max'] == $val2['max'] && $val1['vmin'] == $val2['vmin']) ;
}