Массив в 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 и полезные правила →

Документация