検索機能
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 85/91。
チャレンジ
簡単Library Management System に検索機能を追加して、機能を強化しましょう。特定のタイトルを探している場合、author で閲覧している場合、または現在借りられるものを確認している場合など、Users が簡単に books を見つけられるようにします。
コードを four つのファイルに分けて整理します。
Book.php:readonly プロパティ(isbn、title、author)を持つBookクラス、初期値がtrueの private$isAvailableプロパティ、および次のメソッドを定義します:isAvailable()、markAsBorrowed()、markAsReturned()。User.php:Book ファイルを読み込みます。readonly プロパティ(id、name)を持つUserクラス、private$borrowedBooksarray、値が3のMAX_BOOKS定数、および次のメソッドを定義します:getBorrowedBooks()、canBorrow()、addBook(Book $book)、removeBook(string $isbn)。Library.php:User ファイルを読み込みます。既存の機能に加えて、次の三つの新しい検索メソッドでLibraryクラスを拡張します。searchByTitle(string $keyword): array:title に keyword が含まれる all books を返します(大文字と小文字を区別しない)。searchByAuthor(string $author): array:author 名に検索語が含まれる all books を返します(大文字と小文字を区別しない)。getAvailableBooks(): array:currently 借りることができる books のみを返します。
大文字と小文字を区別しない一致には、arrow functions と
striposを使用したarray_filterを使います。striposは一致が見つからない場合にfalseを返すため、!== falseを確認することを忘れないでください。main.php:Library ファイルを読み込みます。二つの入力、つまり検索 keyword と author 名を受け取ります。Libraryを作成し、次の four books を追加します。- 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"
"978-1"の ISBN を持つ book を、ID が1、name が"TestUser"のUserを使って借ります。次に、以下の検索を実行して結果を出力します。
- 最初の入力を使って title で検索し、一致した各 book の title を新しい行に出力する
- 二番目の入力を使って author で検索し、一致した books の件数を出力する
- available books を取得し、その件数を出力する
出力形式:
Title matches: [title1] [title2] ... Author matches: [count] Available: [count]- ISBN:
この challenge では、array_filter と stripos を組み合わせることで、強力で使いやすい検索機能を作成できることを示します。大文字と小文字を区別しない一致により、Users は検索時に正確な大文字・小文字を気にする必要がありません。
自分で試してみよう
<?php
require_once 'Library.php';
// 入力を読み取る
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));
// TODO: Library のインスタンスを作成する
// TODO: ライブラリに4冊の本を追加する:
// ISBN: "978-0", タイトル: "PHP Basics", 著者: "John Smith"
// ISBN: "978-1", タイトル: "Advanced PHP", 著者: "Jane Doe"
// ISBN: "978-2", タイトル: "Python Guide", 著者: "John Smith"
// ISBN: "978-3", Title: "Web Development", Author: "Alice Brown"
// TODO: ID 1 と名前 "TestUser" の User を作成し、登録する
// TODO: ISBN "978-1" の本を借りる
// TODO: $searchKeyword を使ってタイトルで検索し、結果を出力する
echo "Title matches:\n";
// 一致する各本のタイトルを新しい行に出力する
// TODO: $authorName を使って著者で検索し、件数を出力する
echo "Author matches: " . /* ここに件数 */ "\n";
// TODO: 利用可能な本を取得して件数を出力する
echo "Available: " . /* ここに件数 */ "\n";
?>オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ