Menu
Coddy logo textTech

Функциональность поиска

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 85 из 91.

challenge icon

Задание

Легко

Давайте улучшим нашу систему управления библиотекой, добавив функциональность поиска. Пользователям нужно легко находить книги: искать определённое название, просматривать книги по автору или проверять, какие книги currently доступны для выдачи.

Вы организуете код в four файлах:

  • Book.php: ваш класс Book со свойствами readonly (isbn, title, author), приватным свойством $isAvailable, изначально имеющим значение true, и методами: isAvailable(), markAsBorrowed() и markAsReturned().
  • User.php: подключите файл Book. Ваш класс User со свойствами readonly (id, name), приватным массивом $borrowedBooks, константой MAX_BOOKS со значением 3 и методами: getBorrowedBooks(), canBorrow(), addBook(Book $book) и removeBook(string $isbn).
  • Library.php: подключите файл User. Расширьте класс Library, сохранив существующую функциональность и добавив три новых метода поиска:
    • searchByTitle(string $keyword): array: возвращает все книги, в которых название содержит ключевое слово (без учёта регистра)
    • searchByAuthor(string $author): array: возвращает все книги, в которых имя автора содержит поисковый запрос (без учёта регистра)
    • getAvailableBooks(): array: возвращает только книги, которые currently доступны для выдачи

    Используйте array_filter со стрелочными функциями и stripos для сопоставления без учёта регистра. Помните, что stripos возвращает false, если совпадение не найдено, поэтому проверяйте !== false.

  • main.php: подключите файл Library. Вы получите два входных значения: ключевое слово для поиска и имя автора.

    Создайте Library и добавьте эти four книги:

    • ISBN: "978-0", название: "PHP Basics", автор: "John Smith"
    • ISBN: "978-1", название: "Advanced PHP", автор: "Jane Doe"
    • ISBN: "978-2", название: "Python Guide", автор: "John Smith"
    • ISBN: "978-3", название: "Web Development", автор: "Alice Brown"

    Выдайте книгу с ISBN "978-1", используя User с ID 1 и именем "TestUser".

    Затем выполните следующие поисковые операции и выведите результаты:

    1. Выполните поиск по названию с использованием первого входного значения и выведите название каждой найденной книги с новой строки
    2. Выполните поиск по автору с использованием второго входного значения и выведите количество найденных книг
    3. Получите доступные книги и выведите их количество

    Формат вывода:

    Title matches:
    [title1]
    [title2]
    ...
    Author matches: [count]
    Available: [count]

Эта задача демонстрирует, как array_filter в сочетании с stripos создаёт мощную и удобную для пользователей функциональность поиска. Сопоставление без учёта регистра означает, что пользователям не нужно беспокоиться о точном написании заглавных и строчных букв при поиске.

Попробуйте сами

<?php

require_once 'Library.php';

// Прочитать входные данные
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));

// TODO: Создать экземпляр Library

// TODO: Добавить четыре книги в библиотеку:
// ISBN: "978-0", Title: "PHP Basics", Author: "John Smith"
// ISBN: "978-1", Title: "Advanced PHP", Author: "Jane Doe"
// ISBN: "978-2", Title: "Python Guide", Author: "John Smith"
// ISBN: "978-3", Title: "Web Development", Author: "Alice Brown"

// TODO: Создать User с ID 1 и именем "TestUser", зарегистрировать его

// TODO: Взять книгу с ISBN "978-1"

// TODO: Искать по названию, используя $searchKeyword, и вывести результаты
echo "Title matches:\n";
// Вывести название каждой совпадающей книги на новой строке

// TODO: Искать по автору, используя $authorName, и вывести количество
echo "Author matches: " . /* количество здесь */ "\n";

// TODO: Получить доступные книги и вывести количество
echo "Available: " . /* количество здесь */ "\n";

?>

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP