We have a custom dispatch system where we have orders, if the total quantity within the order exceeds 2 then we need to split the contents over two orders. So for instance…
Order contains:
- Item A x2
- Item B x2
I need to move Item B to a second order.
Another example would be:
- Item A x4
I would need to move 2 items to a second order so I’m left with Item A x2 in one output and the same in another output.
I’m using the following to loop through the items and quantities within an order.
$total_products = array();
foreach($products as $product){
$product_id = $product['sellable']['id'];
$product_quantity = $product['quantity'];
$product_price = $product['price_per_unit'];
array_push($total_products, array($product_id, $product_quantity, $product_price));
}
How can I total up the items in that order – as soon as any of the quantities hit 2, can I move those to a second array? Is using multiple arrays the best approach for this?
This is an example of an array that’s been generated (this can be variable):
Array
(
[0] => Array
(
[0] => 39235995
[1] => 3
[2] => 2.81
)
[1] => Array
(
[0] => 39236029
[1] => 1
[2] => 2.952
)
[2] => Array
(
[0] => 39236015
[1] => 1
[2] => 3.333
)
[3] => Array
(
[0] => 39235997
[1] => 1
[2] => 2.667
)
)
Advertisement
Answer
Managed to figure this out by using the following, this gives me the separate parcels I needed:
// Add the product info we need into a new array
$total_products = array();
foreach($products as $product){
$product_id = $product['sellable']['id'];
$product_quantity = $product['quantity'];
$product_price = $product['price_per_unit'];
$total_products[] = array('id' => $product_id, 'quantity' => $product_quantity, 'price' => $product_price);
}
// Separate out the quantities for each product, one per array
$resultArr = [];
foreach($total_products as $item){
for($i = 0; $i < $item['quantity']; $i++){
$resultArr[] = array(
'id' => $item['id'],
'quantity' => 1,
'price' => $item['price'],
);
}
}
// Divide up into the correct amount of parcels
$parcel_size = 2;
$parcels = array_chunk($resultArr, $parcel_size);