PHP
Задачи по PHP для начинающих с решениями
В этой подборке каждая задача идет с рабочим решением на PHP и коротким объяснением. Такой формат удобен, если вы уже попробовали решить упражнение сами и хотите сверить ход мысли: где подготовлены данные, где условие, где цикл, где функция, где вывод
Код можно запускать через консоль:
php task.php
Для задач с формой используйте встроенный сервер PHP:
php -S localhost:8000
По этой теме полезно отдельно посмотреть Задачи по PHP для начинающих, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Задачи на PHP с решениями: базовые упражнения, чтобы расширить контекст и сравнить подходы
Задача 1. Приветствие
Условие: есть имя пользователя. Нужно вывести приветствие
Решение:
<?php
$name = 'Анна';
echo "Привет, {$name}";
Ожидаемый результат:
Привет, Анна
Что важно: переменная $name хранит строку, а двойные кавычки позволяют подставить значение прямо в текст. Можно решить и через склеивание строк: 'Привет, ' . $name
Проверьте: поменяйте имя на Олег, затем на пустую строку. Подумайте, какое сообщение лучше показывать, если имени нет
Задача 2. Сумма заказа
Условие: товар стоит 500, пользователь покупает 3 штуки. Нужно посчитать итог
Решение:
<?php
$price = 500;
$count = 3;
$total = $price * $count;
echo $total;
Ожидаемый результат:
1500
Что важно: расчет вынесен в $total, поэтому код легче читать и проверять. Если потом понадобится скидка или доставка, вы не будете переписывать весь вывод
Проверьте: поставьте количество 0, 1, 5
Задача 3. Цена со скидкой
Условие: цена товара 2000, скидка 15%. Нужно вывести цену после скидки
Решение:
<?php
$price = 2000;
$discountPercent = 15;
$discount = $price * $discountPercent / 100;
$finalPrice = $price - $discount;
echo $finalPrice;
Ожидаемый результат:
1700
Что важно: скидка считается отдельно. Так проще проверить формулу и вывести пользователю не только финальную цену, но и размер скидки
Проверьте: скидку 0, 50, 100
Задача 4. Проверка возраста
Условие: если пользователю 18 или больше, вывести Доступ открыт, иначе Доступ закрыт
Решение:
<?php
$age = 17;
if ($age >= 18) {
echo 'Доступ открыт';
} else {
echo 'Доступ закрыт';
}
Ожидаемый результат:
Доступ закрыт
Что важно: граничное значение 18 должно попадать в открытую ветку. Поэтому условие пишем как >=, а не >
Проверьте: 17, 18, 19
Задача 5. Оценка по баллам
Условие: если баллов 90 или больше, вывести Отлично; от 60 до 89 — Зачет; ниже 60 — Повторить
Решение:
<?php
$score = 76;
if ($score >= 90) {
echo 'Отлично';
} elseif ($score >= 60) {
echo 'Зачет';
} else {
echo 'Повторить';
}
Ожидаемый результат:
Зачет
Что важно: порядок условий имеет значение. Если сначала проверить $score >= 60, то значение 95 попадет в Зачет, а не в Отлично
Проверьте: 59, 60, 89, 90
Задача 6. Сумма чисел в массиве
Условие: есть массив цен. Нужно посчитать общую сумму
Решение:
<?php
$prices = [1200, 800, 450];
$total = 0;
foreach ($prices as $price) {
$total += $price;
}
echo $total;
Ожидаемый результат:
2450
Что важно: $total — накопитель. До цикла он равен нулю, а на каждой итерации к нему прибавляется очередная цена
Проверьте: пустой массив, один элемент, несколько одинаковых элементов
Задача 7. Фильтрация товаров по цене
Условие: вывести только товары дороже 1000
Решение:
<?php
$products = [
['title' => 'Книга', 'price' => 700],
['title' => 'Курс', 'price' => 3000],
['title' => 'Консультация', 'price' => 1500],
];
foreach ($products as $product) {
if ($product['price'] > 1000) {
echo $product['title'] . PHP_EOL;
}
}
Ожидаемый результат:
Курс
Консультация
Что важно: у каждого товара есть поля title и price. Условие стоит внутри цикла, потому что проверять нужно каждый товар отдельно
Проверьте: добавьте товар за 1000. Он не должен попасть в вывод, потому что условие строго > 1000
Задача 8. Функция расчета скидки
Условие: написать функцию, которая принимает цену и процент скидки, а возвращает новую цену
Решение:
<?php
function applyDiscount(float $price, float $percent): float
{
$discount = $price * $percent / 100;
return $price - $discount;
}
echo applyDiscount(2000, 15);
Ожидаемый результат:
1700
Что важно: функция возвращает значение через return, а не печатает его сама. Так функцию можно использовать в разных местах: в таблице, форме, тесте или расчете заказа
Проверьте: вызовите функцию для 1000, 2500, 0
Задача 9. Безопасный вывод имени из формы
Условие: получить имя из $_POST и вывести приветствие. Если имя пустое, показать сообщение об ошибке
Решение:
<?php
$name = trim($_POST['name'] ?? '');
if ($name === '') {
echo 'Введите имя';
} else {
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
echo "Привет, {$safeName}";
}
Что важно: $_POST['name'] ?? '' защищает от предупреждения, если поле не пришло. trim() убирает пробелы по краям. htmlspecialchars() нужен, чтобы пользовательский текст не превратился в HTML-код страницы
Проверьте: отправьте Анна, пустую строку, строку из пробелов и <b>Анна</b>
Задача 10. Мини-калькулятор заказа из формы
Условие: форма отправляет цену и количество. Нужно проверить данные и вывести сумму
Решение:
<?php
$price = (float) ($_POST['price'] ?? 0);
$count = (int) ($_POST['count'] ?? 0);
if ($price <= 0 || $count <= 0) {
echo 'Цена и количество должны быть больше нуля';
} else {
$total = $price * $count;
echo 'Итого: ' . number_format($total, 2, '.', ' ') . ' руб';
}
Ожидаемый результат для цены 500 и количества 3:
Итого: 1 500.00 руб
Что важно: данные из формы приходят строками, поэтому мы явно приводим цену к float, а количество к int. В реальном проекте проверка должна быть строже, но для первой задачи этого достаточно
Проверьте: пустые поля, текст вместо цены, ноль, отрицательное число
Задача 11. Список ошибок формы
Условие: есть email и пароль. Нужно собрать ошибки в массив и вывести их списком
Решение:
<?php
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$errors = [];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Некорректный email';
}
if (mb_strlen($password) < 6) {
$errors[] = 'Пароль должен быть не короче 6 символов';
}
if ($errors) {
foreach ($errors as $error) {
echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . '<br>';
}
} else {
echo 'Форма заполнена корректно';
}
Что важно: несколько ошибок удобнее хранить в массиве. Тогда пользователь увидит все проблемы сразу, а не будет исправлять форму по одной ошибке
Проверьте: неправильный email, короткий пароль, оба поля правильные
Задача 12. Вывод таблицы товаров
Условие: есть массив товаров. Нужно вывести HTML-таблицу с названием и ценой
Решение:
<?php
$products = [
['title' => 'Книга', 'price' => 700],
['title' => 'Курс', 'price' => 3000],
['title' => 'Консультация', 'price' => 1500],
];
echo '<table>';
echo '<tr><th>Товар</th><th>Цена</th></tr>';
foreach ($products as $product) {
$title = htmlspecialchars($product['title'], ENT_QUOTES, 'UTF-8');
$price = number_format($product['price'], 0, '.', ' ');
echo "<tr><td>{$title}</td><td>{$price} руб</td></tr>";
}
echo '</table>';
Что важно: даже если данные сейчас написаны вручную, полезно привыкать к безопасному выводу. Сегодня название товара задано в коде, завтра оно может прийти из формы или базы
Проверьте: добавьте товар с кавычками или HTML-тегом в названии
Как проверять решения
Сначала запускайте код на обычных данных. Потом меняйте одно значение и заранее предполагайте результат. После этого проверяйте крайний случай: пустую строку, ноль, массив без элементов, неверный email, слишком короткий пароль
Если решение содержит функцию, проверьте ее отдельно от вывода. Хорошая функция принимает данные и возвращает результат. Вывод через echo лучше держать снаружи, чтобы код было проще менять
Если значение пришло от пользователя, не выводите его напрямую. Используйте htmlspecialchars(). Это базовая привычка для PHP-разработчика, даже если вы пока пишете учебный файл
Частые ошибки
- забыть точку при склеивании строк
- перепутать
=и== - написать
elseifкакelse ifв стиле другого языка и запутаться в блоках - не создать
$total = 0перед циклом - выводить пользовательский ввод без
htmlspecialchars() - не проверять, что ключ существует в
$_POST - делать функцию, которая сразу печатает результат, хотя должна вернуть значение
- тестировать только один красивый сценарий