2012-04-01 72 views
0

我试图找到2个数组的差异。php数组差异

$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”吗?

如果不是,我该怎么做我想做的事情?

+0

尝试'的var_dump($结果)'来看看它的结构 – Joseph 2012-04-01 22:04:27

+0

http://php.net/manual/en/function.array-diff。php'返回包含array1中所有其他数组中不存在的所有条目的数组。' – 2012-04-01 22:36:31

+0

是否有一条命令来执行我所需要的操作? – user1022585 2012-04-01 22:37:40

回答

6

返回一个数组,其中包含array1中所有不存在于其他数组中的所有条目。

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

array_diff()给出减去所有阵列除了第一个,从所述第一的结果。因此,第二个数组中的事物不会显示在第二个数组中。 (换言之,它不是对称差。)

2

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

返回包含所有从ARRAY1中不存在任何其它阵列的条目的阵列。

所以,如果你这样做:

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

结果将包含 “5”。

奖励:如果你需要一些作品阵列的顺序如何,试试:

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

第二阵列应该放在第一位

$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); 
0

,使其为你工作期望您需要反驳参数:

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

否则,您正在检查inven_new中缺少哪些元素,并且没有任何遗漏。

0

没有内置的功能,但你可以随便写一个自定义(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); 
+0

非常有帮助,谢谢 – user1022585 2012-04-01 22:46:26

0

这从第一阵列($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) 
} 
1

一个很晚的回应,但也许这会帮助某人有时..

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'); 
    }  
}