Всем привет.
Что-то не могу придумать, как правильно реализовать.
Есть число, скажем
$a = 300;
Есть массив (элементов может быть минимум 1 и максимум - много)
$b = array(
50,
570,
2400,
);
Нужно придумать два варианта вычитания
1 - если есть в массиве число большое из которого можно сразу вычесть $a, то делать это. 2 - если нет большого числа, то разделить $a и списать с каждого элемента в массиве, но так, чтобы элемент не ушел в 0.
Грубо-говоря, чтобы было понятно, $a - это скидка на товары. Нужно ее разделить между ценами товаров, чтобы скидка отнялась либо у самого дорого товара, либо у всех по немного. Главное, не уводить цены товара в 0.
Буду благодарен за помощь в решении задачи!)
Один из вариантов:
Посчитать сумму всех элементов S
Если скидка a меньше S, то раскидать её по всем элементам пропорционально их значениям
b[i] = b[i] - a * b[i] / S
ideone (если нужны целые - значения нужно округлять и накапливать ошибку)
$a = 300;
$b = array(
50,
570,
2400,
);
$s = array_sum($b);
if ($s > $a) {
$ratio = 1 - $a / $s;
for ($i = 0; $i < count($b); $i++) {
$b[$i] *= $ratio;
}
}
var_dump( $b, $s, $ratio);
Как-то так, если я все правильно понял:
<?php
function f (array $prices, int $discount) {
$prices_more_than_discount = array_filter ($prices, function ($price) use ($discount) {
return $price > $discount;
});
if (count ($prices_more_than_discount) > 0) {
$prices [array_search (max ($prices_more_than_discount), $prices)] -= $discount;
}
else {
$sum_of_prices = array_sum ($prices);
if ($sum_of_prices > $discount) {
$new_discount = 1 - $discount / $sum_of_prices;
$prices = array_reduce ($prices, function ($new_prices, $price) use ($new_discount) {
$new_prices [] = $price * $new_discount;
return $new_prices;
}, []);
}
}
return $prices;
}
Сумма в массиве всегда будет больше на 50-70%
$max = max($b);
if ($max > $a) {
$k = array_keys($b, $max)[0];
$b[$k] = $b[$k] - $a;
} else {
$a = $a / count($b);
$b = array_map(function($i)use($a){
return $i - $a;
}, $b);
}
var_dump( $b );
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Мне нужно разработать систему интеграции с различными информационными системами
есть блок кода (назовем его $foo->bar() ) который должен выполнится один раз и только один разкак это организовать в многопользовальском сценарии?