Menu
Coddy logo textTech

検索機能

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 85/91。

challenge icon

チャレンジ

簡単

Library Management System に検索機能を追加して、機能を強化しましょう。特定のタイトルを探している場合、author で閲覧している場合、または現在借りられるものを確認している場合など、Users が簡単に books を見つけられるようにします。

コードを four つのファイルに分けて整理します。

  • Book.php:readonly プロパティ(isbntitleauthor)を持つ Book クラス、初期値が true の private $isAvailable プロパティ、および次のメソッドを定義します:isAvailable()markAsBorrowed()markAsReturned()
  • User.php:Book ファイルを読み込みます。readonly プロパティ(idname)を持つ User クラス、private $borrowedBooks array、値が 3MAX_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 を使って借ります。

    次に、以下の検索を実行して結果を出力します。

    1. 最初の入力を使って title で検索し、一致した各 book の title を新しい行に出力する
    2. 二番目の入力を使って author で検索し、一致した books の件数を出力する
    3. available books を取得し、その件数を出力する

    出力形式:

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

この challenge では、array_filterstripos を組み合わせることで、強力で使いやすい検索機能を作成できることを示します。大文字と小文字を区別しない一致により、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オンラインコンパイラ