Стоит задача сформировать тарные места исходя из веса товаров на PHP

Имеем массив формата Array ( [0] => Array ( [name] => Тестовый товар [article] => testarticle [weight] => 5 [price] => 10 [count] => 8 [poditog] => 80 ) )

Транспортная требует делить заказ на места по 20 кг. В нашем случае вес 40. Задача сформировать массив, где будут 2, 3 или более строк по 20 кг в зависимости от общего веса и веса единицы.

Нужен совет, всю голову сломал


Ответы (1 шт):

Автор решения: mydls1

Мы разбиваем массив на количество мест. К примеру общий вес 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
        )

)
→ Ссылка