Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference quantity between two arrays values

I have two arrays who contains product code as key and quantity as value ('code' => quantity). I would like to generate an array who contain difference of quantity between old array (array1) and new array (array2), including any code added or deleted from array1 to 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
];

I tried something like this but I don't have added or deleted code between arrays :

$diffQty = [];
foreach ($array2 as $code => $qty) {
    if (array_key_exists($code, $array1)) {
        $diffQty = $array1[$code] - $array2[$code];
        $diffQty[$code] = $diffQty;
    }
}
like image 480
Damosse31 Avatar asked Nov 14 '25 10:11

Damosse31


1 Answers

Your current issue is that you don't do anything in the case where the key doesn't exist in both arrays.

Fetch all the unique keys that exists, and put that into a separate array. Loop the resulting array, which now contains all the keys that exists in both arrays $array1 and $array2. Subtract the values in $array1 from $array2, and if there is no key valid in either array, default it to zero.

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

Result of $output

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

Live demo

like image 145
Qirel Avatar answered Nov 17 '25 08:11

Qirel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!