Разделить и вычесть число из нескольких других

97
16 ноября 2020, 11:20

Всем привет.

Что-то не могу придумать, как правильно реализовать.

Есть число, скажем

$a = 300;

Есть массив (элементов может быть минимум 1 и максимум - много)

$b = array(
    50,
    570,
    2400,
);

Нужно придумать два варианта вычитания

1 - если есть в массиве число большое из которого можно сразу вычесть $a, то делать это. 2 - если нет большого числа, то разделить $a и списать с каждого элемента в массиве, но так, чтобы элемент не ушел в 0.

Грубо-говоря, чтобы было понятно, $a - это скидка на товары. Нужно ее разделить между ценами товаров, чтобы скидка отнялась либо у самого дорого товара, либо у всех по немного. Главное, не уводить цены товара в 0.

Буду благодарен за помощь в решении задачи!)

Answer 1

Один из вариантов:

Посчитать сумму всех элементов 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);
Answer 2

Как-то так, если я все правильно понял:

<?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;
}
Answer 3

Сумма в массиве всегда будет больше на 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 );
READ ALSO
Сортировка элементов массива

Сортировка элементов массива

Имеется многомерный массив, выглядит он следующим образом:

117
Уровни исключений и логирование

Уровни исключений и логирование

Мне нужно разработать систему интеграции с различными информационными системами

135
Передача массива в Twig

Передача массива в Twig

Имеется многомерный массив $categories_arr:

125
многопользовательский сценарий

многопользовательский сценарий

есть блок кода (назовем его $foo->bar() ) который должен выполнится один раз и только один разкак это организовать в многопользовальском сценарии?

86