t-alexashka
@t-alexashka
Сразу пишу legacy код

Как узнать какие товары входят в ценник, если известна итоговая сумма?

Привет друзья. Всю ночь ковырял код, пытался понять как так сделать. Есть сумма заказа и есть товары. Надо вычислить какие товары спрятаны в этой сумме. Думал про рекурсию и остаток отделения, но в код это собрать не могу. Настоящая головоломка для моей логики :)

Мой код на php:
<?php

// Входящие данные
$article = 'hp'; // артикул товара
$sum = 3563; //Сумма (для теста тут принтер hp + 4 катриджа: hpb*3 + hpr*1)

// принтеры
$printersPrice = [
	'canon' => 1000,
	'hp' => 2000,
	'xerox' => 3000,
];

// катриджи
$accessories = [
	'canon' => [
		'cnb' => 390,
		'cnbxl' => 490,
	],
	'hp' => [
		'hpr' => 390,
		'hpb' => 391,
		'hpg' => 392,
		'hpk' => 393,
	],
];

$accessoriesSum = $sum - $printersPrice[$article]; // вычитаем стоймость принтера из общей суммы
$basket = [];

buildBasket(...) {...}

/*

на выходе ожидается массив такого содержания
[
	hpb => 3,
	hpr => 1,
]

или false если цена специально неправильно составлена

**/
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Простейшая рекурсия.
function makeBasket($sum, $prices, $result) {
    if ($sum % $prices[0] == 0) {
        return array_merge($result, [$sum / $prices[0]]);
    }
    if (count($prices) == 1) {
        return false;
    }
    for ($i = 0; $i <= $sum / $prices[0]; $i++) {
        $res = makeBasket($sum - $prices[0] * $i, array_slice($prices, 1), array_merge($result, [$i]));
        if ($res != false) {
            return $res;
        }
    }
    return false;
}

$prices = array_values($accessories[$article]);
$res = makeBasket($accessoriesSum, $prices, []);
$result = [];
$i = 0;
foreach ($accessories[$article] as $key => $val) {
    if (($i < count($res)) && ($res[$i] != 0)) {
        $result[$key] = $res[$i];
    }
    $i++;
}
print_r($result);

Возвращает первый найденный результат.
sandbox.onlinephpfunctions.com/code/f9d233c85ed30b...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы