Проблема в том, как array_diff
определяет равенство двух значений:
Примечание : два элемента считаются равными тогда и только тогда, когда (string) $elem1 === (string) $elem2
.На словах: когда строковое представление одинаково.
Проблема здесь в том, что преобразование массивов в строку всегда дает "Array"
:
Массивы всегда преобразуются в строку «Массив»;[…]
Таким образом, каждое значение массива в вашем первом массиве считается дубликатом любого другого значения массива другого массива.И так как array_diff
не возвращает симметричную разницу , но A \ B (т.е. A минус B ) и A содержит больше элементов, чем B , вы просто получаете $Total_val
без возврата первых семи элементов.
Теперь, чтобы получить правильные результаты, вам нужноиспользовать другую функцию сравнения, отличную от сравнения строковых представлений каждого элемента, как array_diff
.Вы можете использовать array_udiff
, чтобы сделать это:
function cmpByIp($a, $b) {
return strcmp($a['ip'], $b['ip']);
}
$diff = array_udiff($Total_val, $duplicates, 'cmpByIp');
Это сравнит ваши элементы массива просто по ip .