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
  • делать функцию, которая сразу печатает результат, хотя должна вернуть значение
  • тестировать только один красивый сценарий
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x