Skip to content

59. Kalkulator podziału kosztów grupowych

This content is not available in your language yet.

Kalkulator podziału kosztów grupowych

Aplikacja do dzielenia kosztów grupowych (np. wyjście, wycieczka): wpisz osoby, ile każda zapłaciła, a system obliczy kto komu ile jest winien, żeby wyrównać rachunki.

  • Algorytmu wyrównania sald (balansowania długów)
  • Operacji matematycznych na tablicach
  • Walidacji liczb zmiennoprzecinkowych
  • Prezentacji wyniku obliczeń w czytelnej formie

Algorytmy podziału kosztów są w aplikacjach takich jak Splitwise, Tricount czy Revolut. Nauka balansowania sald to klasyczny problem algorytmiczny z praktycznym zastosowaniem.

  1. Formularz: lista osób (imiona przez przecinek)
  2. Formularz wydatków: kto zapłacił, za co, ile
  3. Obliczenie udziału równego (suma / liczba osób)
  4. Obliczenie salda każdej osoby (zapłacone - należne)
  5. Wyświetlenie listy transferów: kto komu ile przelewa
{
"group": {
"people": ["Jan", "Anna", "Piotr"],
"expenses": [
{"payer": "Jan", "description": "Pizza", "amount": 60.00},
{"payer": "Anna", "description": "Napoje", "amount": 30.00},
{"payer": "Piotr", "description": "Parking", "amount": 15.00}
]
}
}
  • Formularz osób i wydatków
  • Obliczenie sumy i udziału na osobę
  • Wyświetlenie salda każdej osoby
  • Walidacja kwot
Ocena: 3.0
<?php
// Obliczenie sald i transferów
function calculateSettlement(array $people, array $expenses): array {
$count = count($people);
$total = array_sum(array_column($expenses, 'amount'));
$share = $total / $count;
// Oblicz ile każdy zapłacił
$paid = array_fill_keys($people, 0.0);
foreach ($expenses as $expense) {
$paid[$expense['payer']] += $expense['amount'];
}
// Saldo = zapłacone - należne
$balances = [];
foreach ($people as $person) {
$balances[$person] = round($paid[$person] - $share, 2);
}
// Generuj transfery: od tych z saldem ujemnym do tych z dodatnim
$debtors = array_filter($balances, fn($b) => $b < 0);
$creditors = array_filter($balances, fn($b) => $b > 0);
arsort($creditors);
asort($debtors);
$transfers = [];
// Uproszczona wersja: każdy dłużnik oddaje największemu wierzycielowi
foreach ($debtors as $debtor => $debt) {
foreach ($creditors as $creditor => $credit) {
if ($debt >= 0) break;
$amount = min(abs($debt), $credit);
if ($amount > 0.01) {
$transfers[] = [
'from' => $debtor,
'to' => $creditor,
'amount' => round($amount, 2),
];
$debtors[$debtor] += $amount;
$creditors[$creditor] -= $amount;
}
}
}
return $transfers;
}

Splitwise po polsku!

Zacznij od obliczenia sumy i udziału. Potem salda. Na końcu algorytm transferów. Każdy krok jest osobną funkcją.