Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • Book.php — Ваш класс Book со свойствами только для чтения (isbn, title, author), приватным свойством $isAvailable, которое изначально равно true, и методами: isAvailable(), markAsBorrowed() и markAsReturned().
  • User.php — Подключите файл Book. Ваш класс User со свойствами только для чтения (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 — возвращает только те книги, которые в данный момент доступны для выдачи

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

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

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

    • 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"

    Возьмите книгу с 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", Название: "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"

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

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

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

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

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

?>

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