4

I would like to subtract the quantity of $array2 from the stocks of $array1.

$array1= ([product_id]=>4, [stocks]=>20)

$array2= ([product_id]=>4, [quantity]=>3)

So that would be:
$array1= ([0]=> 4, [1] => 20);
$array2= ([0]=> 4, [1] => 3);

And then the output should be:

$array1= ([0]=> 4, [1] => 17);
4
  • 1
    This can be done by looping through one array and comparing keys with the other, then doing the math as needed. What have you tried so far? Some code and where you are failing would be helpful. Commented Oct 22, 2013 at 19:01
  • $total = $array1['stocks'] - $array2['quantity'] Commented Oct 22, 2013 at 19:07
  • @Crackertastic I tried array_diff() but it only returns one element, I really new to this kind of array manipulation :( Commented Oct 22, 2013 at 19:08
  • @JuanDJensen I see. array_diff() isn't actually used for mathematical calculation between arrays. What it does is looks for elements that aren't common between multiple arrays and returns a new array of those elements. I think in your case a loop implementation will be best. Something that looks at array keys and then does the proper math. Commented Oct 22, 2013 at 19:12

3 Answers 3

2

Your array structure looks slightly different with multiple records, the code works out like this in an ugly manner. I'm assuming you're talking about something like this:

$array1 = array(
    0=>array('product_id'=>4, 'stocks'=>20), 
    1=>array('product_id'=>5, 'stocks'=>60));
$array2 = array(
    0=>array('product_id'=>4, 'quantity'=>3)
    1=>array('product_id'=>5, 'quantity'=>30));

...It's a multi-dimensional array (typical for records pulled from a database).

foreach($array1 as $key=>$value){
    foreach($array2 as $key2=>$value2) {
        if($value['product_id']==$value2['product_id']){
            $value['stocks'] -= $value2['quantity'];
            //optimization to avoid searching this again.
            unset($array2[$key]);
        }
    }}
Sign up to request clarification or add additional context in comments.

Comments

2

With what you have given the following will do what you are asking for:

if($array1['product_id'] == $array2['product_id']) {
    $array1['stocks'] -= $array2['quantity'];
}

If you need to loop through a bigger array then what I have given is only part of the larger puzzle.

2 Comments

What if there are more than one products ? any idea ? :)
Well, I would guess you are dealing with two multidimensional arrays in that case. It it were me I would loop using a for loop to go through the $array1 array to get my product_id and stocks. Within that loop I would use another for loop to go through $array2 and look for a matching product_id and then subtract any quantity values from stocks in $array1. Optionally, I may nullify values in $array2 that I have processed so I can reduce the amount of work the inner for loop must do.
1

Jesse's answer wasn't tested and will not provide the desired output because the "stocks" array wasn't being modified -- a copy of the array was being modified in the loop -- so if you try to print the result to screen, there would be no change.

To modify by reference, use & just before the value variable in the first loop.

Also the unset() key must come from the inner loop to be accurate.

Additionally, if the "sales" "product_id"s are unique, then breaking the inner loop upon matching will improve performance. (This is how array_search() works.)

Code: (Demo)

$stocks = [
    ['product_id'=>2, 'stocks'=>50], 
    ['product_id'=>3, 'stocks'=>100],
    ['product_id'=>4, 'stocks'=>20], 
    ['product_id'=>5, 'stocks'=>60]
];
$sales = [
    ['product_id'=>4, 'quantity'=>3],
    ['product_id'=>5, 'quantity'=>30]
];

foreach ($stocks as &$row) {                             // modify by reference
    foreach ($sales as $k => $row2) {                    // search for product_id match
        if ($row['product_id'] == $row2['product_id']) {
            $row['stocks'] -= $row2['quantity'];         // subtract
            unset($sales[$k]);                           // eliminate match from lookup array
            break;                                       // assuming $sales['product_id'] values are unique
        }
    }
}

var_export($stocks);

Output:

array (
  0 => 
  array (
    'product_id' => 2,
    'stocks' => 50,
  ),
  1 => 
  array (
    'product_id' => 3,
    'stocks' => 100,
  ),
  2 => 
  array (
    'product_id' => 4,
    'stocks' => 17,
  ),
  3 => 
  array (
    'product_id' => 5,
    'stocks' => 30,
  ),
)

Alternatively, you can converted the sales array into a flattened, product_id-keyed array to serve as a lookup.

Code: (Demo)

$keyed = array_column($sales, 'quantity', 'product_id');
var_export($keyed);
echo "\n---\n";

foreach ($stocks as &$row) {                          // modify by reference
    if (isset($keyed[$row['product_id']])) {          // search for product_id match
        $row['stocks'] -= $keyed[$row['product_id']]; // subtract
    }
}

var_export($stocks);

Output:

array (
  4 => 3,
  5 => 30,
)
---
array (
  0 => 
  array (
    'product_id' => 2,
    'stocks' => 50,
  ),
  1 => 
  array (
    'product_id' => 3,
    'stocks' => 100,
  ),
  2 => 
  array (
    'product_id' => 4,
    'stocks' => 17,
  ),
  3 => 
  array (
    'product_id' => 5,
    'stocks' => 30,
  ),
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.