Czego się nauczysz?
- Walidacji danych liczbowych (waga, wzrost)
- Wykonywania obliczeń matematycznych w PHP
- Interpretacji wyników według przedziałów
- Formatowania i prezentacji danych zdrowotnych
- Tworzenia historii pomiarów i trendów
Stworzysz Kalkulator BMI - aplikację umożliwiającą obliczanie wskaźnika masy ciała na podstawie wagi i wzrostu. System interpretuje wynik według skali WHO, może prowadzić historię pomiarów i pokazywać postępy użytkownika w czasie.
Czego się nauczysz?
W prawdziwej pracy...
Kalkulatory zdrowotne są podstawą wielu aplikacji fitness i wellness. Umiejętność projektowania systemów z walidacją danych liczbowych, interpretacją wyników według określonych kryteriów i śledzeniem historii jest fundamentem dla każdego programisty tworzącego aplikacje zdrowotne, dietetyczne czy treningowe.
Formularz wprowadzania danych Użytkownik podaje swoją wagę w kilogramach i wzrost w centymetrach (lub metrach). Opcjonalnie może podać datę pomiaru.
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy waga i wzrost są liczbami dodatnimi, czy wartości są realistyczne (np. wzrost 50-250 cm).
Obliczenie BMI System oblicza BMI według wzoru: waga (kg) / wzrost² (m) i wyświetla wynik z dokładnością do 1 miejsca po przecinku.
Interpretacja wyniku System kategoryzuje wynik według skali WHO: niedowaga, norma, nadwaga, otyłość - z odpowiednimi kolorami i komentarzami.
Przykładowa struktura pliku JSON:
{ "measurements": [ { "id": 1, "weight": 75.5, "height": 180, "bmi": 23.3, "category": "norma", "date": "2026-02-10", "created_at": "2026-02-10 08:30:00" }, { "id": 2, "weight": 74.0, "height": 180, "bmi": 22.8, "category": "norma", "date": "2026-02-17", "created_at": "2026-02-17 08:15:00" }, { "id": 3, "weight": 92.0, "height": 175, "bmi": 30.0, "category": "otyłość I stopnia", "date": "2026-02-18", "created_at": "2026-02-18 09:00:00" } ]}| BMI | Kategoria |
|---|---|
| < 18.5 | Niedowaga |
| 18.5 - 24.9 | Norma |
| 25.0 - 29.9 | Nadwaga |
| 30.0 - 34.9 | Otyłość I stopnia |
| 35.0 - 39.9 | Otyłość II stopnia |
| ≥ 40.0 | Otyłość III stopnia |
Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wpisuje wagę 75 kg i wzrost 180 cm. Po kliknięciu “Oblicz” widzi: “Twoje BMI: 23.1”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik wpisuje wagę i wzrost. System wyświetla: “BMI: 23.1 - Norma” z zielonym tłem. Pod spodem widzi: “Twoja waga mieści się w zdrowym zakresie (61-82 kg dla Twojego wzrostu)”.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi swój aktualny BMI oraz historię: “10.02: 23.5, 17.02: 23.1, 24.02: 22.8”. Wykres pokazuje trend spadkowy. Statystyki: “Zmiana od pierwszego pomiaru: -0.7 BMI, Trend: malejący”.
Walidacja danych wejściowych:
$weight = filter_var($_POST['weight'] ?? '', FILTER_VALIDATE_FLOAT);$height = filter_var($_POST['height'] ?? '', FILTER_VALIDATE_FLOAT);
if ($weight === false || $weight <= 0) { $errors[] = "Waga musi być liczbą dodatnią";}
if ($height === false || $height <= 0) { $errors[] = "Wzrost musi być liczbą dodatnią";}
// Realistyczne zakresyif ($weight > 0 && ($weight < 20 || $weight > 300)) { $errors[] = "Waga powinna być w zakresie 20-300 kg";}
if ($height > 0 && ($height < 50 || $height > 250)) { $errors[] = "Wzrost powinien być w zakresie 50-250 cm";}Obliczanie BMI:
function calculateBmi(float $weight, float $heightCm): float { // Konwersja cm na metry $heightM = $heightCm / 100;
if ($heightM <= 0) { return 0; }
return round($weight / ($heightM * $heightM), 1);}Interpretacja wyniku:
function getBmiCategory(float $bmi): array { $categories = [ ['max' => 18.5, 'name' => 'niedowaga', 'color' => '#3498db', 'advice' => 'Rozważ zwiększenie masy ciała'], ['max' => 25.0, 'name' => 'norma', 'color' => '#27ae60', 'advice' => 'Twoja waga jest prawidłowa'], ['max' => 30.0, 'name' => 'nadwaga', 'color' => '#f39c12', 'advice' => 'Rozważ zmniejszenie masy ciała'], ['max' => 35.0, 'name' => 'otyłość I stopnia', 'color' => '#e67e22', 'advice' => 'Zalecana konsultacja z lekarzem'], ['max' => 40.0, 'name' => 'otyłość II stopnia', 'color' => '#e74c3c', 'advice' => 'Wskazana konsultacja z lekarzem'], ['max' => PHP_FLOAT_MAX, 'name' => 'otyłość III stopnia', 'color' => '#c0392b', 'advice' => 'Konieczna konsultacja z lekarzem'], ];
foreach ($categories as $category) { if ($bmi < $category['max']) { return $category; } }
return end($categories);}Obliczanie idealnej wagi:
function getIdealWeightRange(float $heightCm): array { $heightM = $heightCm / 100;
// BMI 18.5 - 24.9 jako zakres normy $minWeight = round(18.5 * $heightM * $heightM, 1); $maxWeight = round(24.9 * $heightM * $heightM, 1);
return [ 'min' => $minWeight, 'max' => $maxWeight, ];}
// Użycie$range = getIdealWeightRange(180);echo "Idealna waga: {$range['min']}-{$range['max']} kg";// Wynik: Idealna waga: 59.9-80.7 kgŚledzenie zmian (wariant C):
function calculateProgress(array $measurements): array { if (count($measurements) < 2) { return ['change' => 0, 'trend' => 'brak danych']; }
// Sortuj po dacie usort($measurements, fn($a, $b) => $a['date'] <=> $b['date']);
$first = reset($measurements); $last = end($measurements);
$change = round($last['bmi'] - $first['bmi'], 1); $trend = $change > 0 ? 'rosnący' : ($change < 0 ? 'malejący' : 'stabilny');
return [ 'first_bmi' => $first['bmi'], 'last_bmi' => $last['bmi'], 'change' => $change, 'trend' => $trend, 'measurements_count' => count($measurements), ];}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!