Массив в PHP — это упорядоченная коллекция значений. Им можно представить и одну книгу, и весь каталог. Важно договориться о форме каждой записи: если у одной книги ключ называется title, не называйте его name у другой.
Одна книга — ассоциативный массив
$book = [
'title' => 'Дюна',
'author' => 'Фрэнк Герберт',
'year' => 1965,
'status' => 'read',
'rating' => 5,
];
echo $book['title'];
Ключи title и year объясняют назначение значений. Такой массив называется ассоциативным. Если запросить отсутствующий ключ, PHP выдаст предупреждение, поэтому заранее задавайте одинаковую структуру или проверяйте наличие ключа.
Список книг — индексированный массив
$books = [
[
'title' => 'Дюна',
'author' => 'Фрэнк Герберт',
'year' => 1965,
'status' => 'read',
'rating' => 5,
],
[
'title' => 'Левая рука тьмы',
'author' => 'Урсула Ле Гуин',
'year' => 1969,
'status' => 'reading',
'rating' => null,
],
];
Здесь внешний массив хранит книги по порядку, а каждый элемент — отдельная запись с именованными ключами. У второй книги оценка пока null: ключ существует, но оценка ещё не выставлена.
Поиск, фильтр и преобразование
В PHP есть функции, которые позволяют преобразовать список без ручного цикла. Например, отберём прочитанные:
$readBooks = array_filter(
$books,
static fn (array $book): bool => $book['status'] === 'read'
);
array_filter() оставляет элементы, для которых функция вернула true. Ключи исходного массива сохраняются; если нужен непрерывный список с индексами от нуля, примените array_values($readBooks).
Для нового списка заголовков используйте array_map():
$titles = array_map(
static fn (array $book): string => $book['title'],
$books
);
Стрелочная функция fn коротко записывает небольшое выражение. Для нескольких действий и подробной проверки удобнее обычная функция или цикл.
Не сортируйте исходный каталог случайно
Функции sort() и usort() меняют массив на месте. Если порядок исходного набора ещё нужен, сначала сохраните копию:
$byYear = $books;
usort(
$byYear,
static fn (array $left, array $right): int => $left['year'] <=> $right['year']
);
Оператор сравнения <=> возвращает отрицательное число, ноль или положительное число. Так usort() понимает порядок двух записей. В нашем примере старые книги окажутся выше новых.
Следующий шаг — перестать полагаться на договорённость
Ассоциативные массивы просты, но редактор может по ошибке создать структуру без year или положить в него текст. Пока мы держим это соглашение в голове; скоро вынесем общие действия в функции, а затем сделаем отдельный тип Book, который сам проверяет свои данные.
Для практики добавьте третью книгу, отберите список на чтение и получите массив заголовков. Проверьте также, какой список возвращает array_filter(): с сохранёнными исходными ключами или с перенумерованными.
Навигация по курсу
Часть 4 из 16.
← Часть 3: Условия и циклы в PHP: выбираем книги для каталога · Часть 5: Функции PHP: типы аргументов, return и полезные правила →
0
9