В работе с повседневными задачами может понадобится разбить большое число на несколько более мелких частей где сумма этих частей будет равна заданному большому числу. Например такие операции разделения суммы могут потребоваться при разделении суммы оплаты на определённое число транзакций.
Например:
У нас есть сумма корзины или заказа равная 10350.8 руб., нам надо что бы каждая оплата была не более 1500.5 руб. (пример умышленно взят с копейками, для полноты понимания). Задача разбить корзину на оплаты, где каждая оплата не может превышать 1500.5 руб.
Делаем небольшую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/** * Возвращает массив чисел где каждое число не больше $max_summ_parts * А сумма массива равна $summ * @param number $summ int or float Сумма которую нужно разбить на части * @param number $max_summ_parts int or float Максимальное значение 1-й части * @return array Вернёт массив с частями не более $max_summ_parts и сумма массива равна $summ */ function get_parts_summ($summ, $max_summ_parts) { $parts = round($summ / $max_summ_parts); //Всего частей $tail = $summ % $max_summ_parts; //Остаток от деления или хвост $result = []; for ($i = 0; $i < $parts; $i++) { $result[] = $max_summ_parts; } $sum_result = array_sum($result); if ($sum_result > $summ) { $result[] = round(array_pop($result) - ($sum_result - $summ), 2); } if ($sum_result < $summ) { $tail_rest = fmod($summ, $max_summ_parts); //Дробная часть отатка от деления $result[] = round($tail_rest, 2); } return $result; } |
Результатом работы функции будет массив значений, содержащих в каждом значении (кроме последнего) — 1500.5. Последним значением будет остаток для дополнения до заданной суммы.
Например зададим такие условия для функции:
1 2 3 4 5 6 7 8 9 |
$summ = 10350.8; $max_summ_parts = 1500.5; //И сразу отобразим результат echo '<pre>'; print_r(get_parts_summ($summ,$max_summ_parts)); echo '</pre>'; |
В результате получим вывод на экран:
1 2 3 4 5 6 7 8 9 10 11 12 |
Array ( [0] => 1500.5 [1] => 1500.5 [2] => 1500.5 [3] => 1500.5 [4] => 1500.5 [5] => 1500.5 [6] => 1347.8 ) |
Как видно из примера мы разбили сумму заказа на части более мелких оплат согласно условию размера максимальной части оплаты.