Я пытаюсь найти разницу в 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) }