Przejdź do głównej zawartości

Kalkulator BMI

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?

  • 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

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.

  1. Formularz wprowadzania danych Użytkownik podaje swoją wagę w kilogramach i wzrost w centymetrach (lub metrach). Opcjonalnie może podać datę pomiaru.

  2. Walidacja danych System sprawdza poprawność wprowadzonych danych - czy waga i wzrost są liczbami dodatnimi, czy wartości są realistyczne (np. wzrost 50-250 cm).

  3. 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.

  4. 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"
}
]
}
BMIKategoria
< 18.5Niedowaga
18.5 - 24.9Norma
25.0 - 29.9Nadwaga
30.0 - 34.9Otyłość I stopnia
35.0 - 39.9Otyłość II stopnia
≥ 40.0Otyłość III stopnia

Wymagane funkcje:

  • Formularz z polami: waga (kg), wzrost (cm lub m)
  • Walidacja danych w PHP (wartości > 0, realistyczne zakresy)
  • Obliczenie BMI: waga / (wzrost w metrach)²
  • Wyświetlenie wyniku z 1 miejscem po przecinku
  • Prosty interfejs CSS

Przykładowy scenariusz:

Użytkownik wpisuje wagę 75 kg i wzrost 180 cm. Po kliknięciu “Oblicz” widzi: “Twoje BMI: 23.1”.

Ocena: 3.0

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 zakresy
if ($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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!