検索機能
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 85/91。
チャレンジ
簡単検索機能を追加して、図書館管理システムを強化しましょう。ユーザーが特定のタイトルを探したり、著者でブラウズしたり、現在貸出可能な本を確認したりできるように、本を簡単に見つけられるようにする必要があります。
コードは以下の4つのファイルに分けて構成します:
Book.php— 読み取り専用プロパティ(isbn、title、author)、初期値がtrueのプライベートプロパティ$isAvailable、およびメソッドisAvailable()、markAsBorrowed()、markAsReturned()を持つBookクラス。User.php— Book ファイルをインクルードします。読み取り専用プロパティ(id、name)、プライベートな$borrowedBooks配列、値が3のMAX_BOOKS定数、およびメソッドgetBorrowedBooks()、canBorrow()、addBook(Book $book)、removeBook(string $isbn)を持つUserクラス。Library.php— User ファイルをインクルードします。既存の機能に加えて、以下の3つの新しい検索メソッドを持つようにLibraryクラスを拡張します:searchByTitle(string $keyword): array— タイトルにキーワードが含まれるすべての本を返します(大文字と小文字を区別しません)。searchByAuthor(string $author): array— 著者名に検索語が含まれるすべての本を返します(大文字と小文字を区別しません)。getAvailableBooks(): array— 現在貸出可能な本のみを返します。
大文字と小文字を区別しないマッチングには、アロー関数を用いた
array_filterとstriposを使用してください。striposは一致が見つからない場合にfalseを返すため、!== falseでチェックすることを忘れないでください。main.php— Library ファイルをインクルードします。検索キーワードと著者名の2つの入力を受け取ります。Libraryインスタンスを作成し、以下の4冊の本を追加してください:- 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"
IDが
1、名前が"TestUser"のUserを使用して、ISBN"978-1"の本を借ります。その後、以下の検索を実行し、結果を出力してください:
- 最初の入力を使用してタイトルで検索し、一致する各本のタイトルを新しい行に出力します。
- 2番目の入力を使用して著者で検索し、一致する本の数を出力します。
- 貸出可能な本を取得し、その数を出力します。
出力形式:
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: 4冊の本をライブラリに追加する:
// 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: ID 1、名前 "TestUser" のユーザーを作成し、登録する
// TODO: ISBN "978-1" の本を借りる
// TODO: $searchKeyword を使用してタイトルで検索し、結果を表示する
echo "Title matches:\n";
// 一致する各本のタイトルを新しい行に表示する
// TODO: $authorName を使用して著者で検索し、件数を表示する
echo "Author matches: " . /* ここに件数 */ "\n";
// TODO: 利用可能な本を取得し、件数を表示する
echo "Available: " . /* ここに件数 */ "\n";
?>