2017-05-08 194 views
3

我有两个数组,其中包含产品代码作为键和数量作为值('code'=> quantity)。我想生成一个数组,其中包含旧数组(array1)和新数组(array2)之间的数量差异,包括从array1添加或删除的任何代码到array2。两个数组之间的差异值

$array1 = ['code1' => 1, 'code2' => 2];  
$array2 = ['code1' => 0, 'code2' => 2, 'code3' => 3]; 

// Array expected 
$diffQty = [ 
    'code1' => -1, // 1 quantity deleted in array 2 
    'code2' => 0, // quantity no changed between array1 and array2 
    'code3' => 3 // new code added in array2 with 3 quantity 
]; 

我想是这样的,但我没有阵列之间添加或删除代码:

$diffQty = []; 
foreach ($array2 as $code => $qty) { 
    if (array_key_exists($code, $array1)) { 
     $diffQty = $array1[$code] - $array2[$code]; 
     $diffQty[$code] = $diffQty; 
    } 
} 
+2

我想看看你有什么企图。 –

+0

嗨@u_mulder我编辑了我的文章 – Damosse31

回答

2

您当前的问题是,你没有的情况下作出任何事情,关键没有按在两个阵列中都不存在。

获取存在的所有唯一键,并将其放入单独的数组中。循环结果数组,该数组现在包含数组$array1$array2中存在的所有键。从$array2减去$array1中的值,如果在任一数组中都没有有效的密钥,则将其默认为零。

结果的
$array1 = ['code1' => 1, 'code2' => 2];  
$array2 = ['code1' => 0, 'code2' => 2, 'code3' => 3]; 
$all_keys = array_unique(array_merge(array_keys($array1), array_keys($array2))); 
$output = array(); 

foreach ($all_keys as $code) { 
    $output[$code] = (!empty($array2[$code]) ? $array2[$code] : 0) - (!empty($array1[$code]) ? $array1[$code] : 0); 
} 

$output

Array (
    [code1] => -1 
    [code2] => 0 
    [code3] => 3 
) 

Live demo

+0

它的工作,但如果我从$ array1中删除code2,它不会被添加到$输出(如'code2'=> -2) – Damosse31

+0

这个问题没有明确说明,但修改后的答案应该适用于此。 – Qirel

+0

这是在我的问题(“包括添加或从array1删除任何代码到array2”)。你的解决方案很好,谢谢! – Damosse31