Функциональность поиска
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 85 из 91.
Задание
ЛегкоДавайте улучшим нашу систему управления библиотекой, добавив функциональность поиска. Пользователям нужно легко находить книги: искать определённое название, просматривать книги по автору или проверять, какие книги 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с ID1и именем"TestUser".Затем выполните следующие поисковые операции и выведите результаты:
- Выполните поиск по названию с использованием первого входного значения и выведите название каждой найденной книги с новой строки
- Выполните поиск по автору с использованием второго входного значения и выведите количество найденных книг
- Получите доступные книги и выведите их количество
Формат вывода:
Title matches: [title1] [title2] ... Author matches: [count] Available: [count]- ISBN:
Эта задача демонстрирует, как 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";
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция11Система типов и обработка ошибок
Объявления типовNullable-типыОбъединение и пересечение типовКлассы исключенийПользовательская иерархия исключенийTry, Catch, FinallyПовторение — валидатор формы14Проект: управление библиотекой
Обзор проектаКлассы книг и пользователей3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP