В каталоге появилась первая запись. Теперь представим, что книг уже двадцать: нужно показать только прочитанные, выделить те, что в процессе, и посчитать общее количество. Условия выбирают путь выполнения, а циклы повторяют действие для каждого элемента.
Условия читаются как правила каталога
<?php
$status = 'reading';
if ($status === 'read') {
echo 'Книга прочитана';
} elseif ($status === 'reading') {
echo 'Сейчас читаю';
} else {
echo 'К чтению позже';
}
Используйте === для точного сравнения. Если возможны только несколько известных вариантов, можно применить match — выражение, которое выбирает результат по значению:
$label = match ($status) {
'read' => 'Прочитано',
'reading' => 'Читаю сейчас',
'planned' => 'В планах',
default => 'Неизвестный статус',
};
В отличие от старого switch, match сравнивает значения строго, возвращает результат и требует покрыть варианты либо явно указать default. Так ошибка в неожиданном статусе не превращается в молчаливое поведение.
Цикл по списку
На этом шаге каталог пока хранится в переменной. Структуру массива разберём подробнее в следующей части:
$books = [
['title' => 'Дюна', 'status' => 'read'],
['title' => 'Пикник на обочине', 'status' => 'reading'],
['title' => 'Солярис', 'status' => 'planned'],
];
foreach ($books as $book) {
if ($book['status'] === 'read') {
echo $book['title'] . "\n";
}
}
foreach берёт очередное значение из массива и помещает его в $book. На каждой итерации проверка статуса решает, выводить книгу или перейти дальше. Если список пустой, цикл просто не выполнится.
Когда подойдёт for или while
foreach лучше подходит, когда нужно обработать каждый элемент набора. for удобен, когда число повторений известно заранее или нужен индекс. while повторяет действие, пока условие истинно, например пока остаются страницы ответа от внешнего сервиса. Для списка книг выбирайте foreach: он не требует вручную управлять индексом.
Считаем прочитанное
$readCount = 0;
foreach ($books as $book) {
if ($book['status'] === 'read') {
$readCount++;
}
}
echo 'Прочитано книг: ' . $readCount;
Оператор ++ увеличивает число на единицу. Переменную счётчика задаём до цикла; если объявить её внутри, на каждой итерации она будет начинаться заново.
Не позволяйте неизвестному статусу исчезнуть
Если статус вводится вручную, опечатка вроде reaad не совпадёт ни с одним правилом и может скрыть книгу из списка. Для простого скрипта добавьте ветку по умолчанию. В более крупном приложении мы ограничим набор статусов типом enum, чтобы неправильное значение было невозможно создать незаметно.
Задача на пару минут
Добавьте в массив ещё две книги — одну со статусом read, одну со статусом planned. Выведите только запланированные и проверьте, что счётчик прочитанного вырос ровно на один. Если выводится не то, проверьте значение статуса и сравнение.
В следующей части разложим записи по полкам: посмотрим, как устроен индексированный и ассоциативный массив и почему удобно хранить список одинаковых записей единообразно.
Навигация по курсу
Часть 3 из 16.
← Часть 2: Типы данных PHP: строки, числа, null и строгая типизация · Часть 4: Массивы PHP: собираем и фильтруем каталог книг →
0
8