Стоит задача сформировать тарные места исходя из веса товаров на PHP
Имеем массив формата Array ( [0] => Array ( [name] => Тестовый товар [article] => testarticle [weight] => 5 [price] => 10 [count] => 8 [poditog] => 80 ) )
Транспортная требует делить заказ на места по 20 кг. В нашем случае вес 40. Задача сформировать массив, где будут 2, 3 или более строк по 20 кг в зависимости от общего веса и веса единицы.
Нужен совет, всю голову сломал
Ответы (1 шт):
Мы разбиваем массив на количество мест. К примеру общий вес 40кг и количество 8 шт. А место 20 кг, значит у нас будет 2 места по 20 кг с количеством 4 шт в месте (20/5 = 4)
<?php
function splitItemsIntoParcels($items, $maxParcelWeight)
{
$parcels = array();
foreach ($items as $item) {
$name = $item['name'];
$article = $item['article'];
$unitWeight = $item['weight'];
$price = $item['price'];
$totalCount = $item['count'];
// Вычисляем максимальное количество единиц товара в одном месте
$unitsPerParcel = floor($maxParcelWeight / $unitWeight);
// Если вес единицы больше максимального веса места, отправляем по одной единице в место
if ($unitsPerParcel == 0) {
$unitsPerParcel = 1;
}
$remainingUnits = $totalCount;
while ($remainingUnits > 0) {
$parcelUnits = min($unitsPerParcel, $remainingUnits);
$parcelPoditog = $parcelUnits * $price;
$parcel = array(
'name' => $name,
'article' => $article,
'weight' => $unitWeight,
'price' => $price,
'count' => $parcelUnits,
'poditog' => $parcelPoditog,
);
$parcels[] = $parcel;
$remainingUnits -= $parcelUnits;
}
}
return $parcels;
}
// Пример использования:
$items = array(
array(
'name' => 'Тестовый товар',
'article' => 'testarticle',
'weight' => 5,
'price' => 10,
'count' => 8,
'poditog' => 80,
),
);
$maxParcelWeight = 20;
$parcels = splitItemsIntoParcels($items, $maxParcelWeight);
print_r($parcels);
Остальные элементы массива вы можете заполнять согласно вашей бизнес логике . В вашем вопросе, очень ограниченная информация.
Вот пример вывода
Array
(
[0] => Array
(
[name] => Тестовый товар
[article] => testarticle
[weight] => 5
[price] => 10
[count] => 4
[poditog] => 40
)
[1] => Array
(
[name] => Тестовый товар
[article] => testarticle
[weight] => 5
[price] => 10
[count] => 4
[poditog] => 40
)
)