Разница в php-массиве

Я пытаюсь найти разницу в 2 массивах.

$inven_old = array(1,2,3,4); $inven_new = array(1,2,3,4,5); $result = array_diff($inven_old, $inven_new); print_r($result); 

Почему результат ничего?

Разве это не должно быть «5»?

Если нет, как я могу сделать то, что я пытаюсь сделать?

Возвращает массив, содержащий все записи из массива1, которые не присутствуют ни в одном из других массивов.

http://php.net/manual/en/function.array-diff.php

array_diff() дает результат вычитания всех массивов, кроме первого, из первого. Таким образом, вещи, которые находятся во втором массиве, но не первые, не будут отображаться. (Другими словами, это не симметричная разница).

http://www.php.net/manual/en/function.array-diff.php

Возвращает массив, содержащий все записи из массива1, которые не присутствуют ни в одном из других массивов.

Поэтому, если вы это сделаете:

 $result = array_diff($inven_new, $inven_old); 

Результат будет содержать «5».

Бонус: если вам требуется что-то, что работает независимо от порядка массивов, попробуйте:

 $result = array_diff($a + $b, array_intersect($a, $b)); 

Очень поздний ответ, но, возможно, это когда-нибудь поможет кому-то …

 function array_deep_diff($d1, $d2) { if (is_array($d1) && is_array($d2)) { $diff = array(); foreach (array_unique(array_merge(array_keys($d1), array_keys($d2))) as $key) { if (!array_key_exists($key, $d1)) { $diff['added'][$key] = $d2[$key]; } else if (!array_key_exists($key, $d2)) { $diff['removed'][$key] = $d1[$key]; } else { $tmp = array_deep_diff($d1[$key], $d2[$key]); if (!empty($tmp)) $diff[$key] = $tmp; } } return $diff; } else if (!is_array($d1) && !is_array($d2)) { if ($d1 == $d2) return array(); $ret = "$d1 ---> $d2"; // just a little touch for numerics, might not be needed if (is_numeric($d1) && is_numeric($d2)) { if ($d1 > $d2) $ret .= ' [- ' . ($d1 - $d2) . ']'; if ($d1 < $d2) $ret .= ' [+ ' . ($d2 - $d1) . ']'; } return $ret; } else { return array('Array compared with NonArray'); } } 

чтобы он работал, так как вы ожидаете, что вам нужно изменить аргументы:

 $result = array_diff($inven_new, $inven_old); 

В противном случае вы проверяете, какие элементы отсутствуют в inven_new, и, как ни странно, нет.

Второй массив должен быть первым

 $inven_old = array(1,2,3,4); $inven_new = array(1,2,3,4,5); $result = array_diff($inven_new, $inven_old); print_r($result); 

Нет встроенной функции, но вы можете легко написать пользовательский ( http://ideone.com/UNRKV ):

 $old = array(5,5,4); $new = array(5,5,4,4); function array_subtract($a, $b) { foreach ($b as $val) { $i = array_search($val, $a); if ($i !== false) { unset($a[$i]); } } return array_values($a); } $result = array_subtract($new, $old); var_dump($result); с $old = array(5,5,4); $new = array(5,5,4,4); function array_subtract($a, $b) { foreach ($b as $val) { $i = array_search($val, $a); if ($i !== false) { unset($a[$i]); } } return array_values($a); } $result = array_subtract($new, $old); var_dump($result); 

Это потребляет из первого массива ( $old ), пока все не исчезнет:

 $result = array(); $old = array_count_values($old); foreach($new as $value) { @$old[$value] ? $old[$value]-- : $result[] = $value; } 

Результат:

 $old = array(5,5,4); $new = array(5,5,4,4); ... array(1) { [0]=> int(4) }