Menu
CoddyTech

搜索功能

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 85 课,共 91 课。

challenge icon

挑战

简单

让我们为图书管理系统添加搜索功能。用户需要轻松查找图书,无论是查找特定书名、按作者浏览,还是查看当前可借阅的图书。

你需要将代码分到 4 个文件中:

  • Book.php:定义 Book 类,其中包含只读属性(isbn、title、author)、一个初始值为 true 的私有属性 $isAvailable,以及以下方法:isAvailable()、markAsBorrowed() 和 markAsReturned()。
  • User.php:引入 Book 文件。定义 User 类,其中包含只读属性(id、name)、一个私有 $borrowedBooks 数组、值为 3 的 MAX_BOOKS 常量,以及以下方法:getBorrowedBooks()、canBorrow()、addBook(Book $book) 和 removeBook(string $isbn)。
  • Library.php:引入 User 文件。在 Library 类中保留现有功能,并添加以下 3 个搜索方法:
    • searchByTitle(string $keyword): array:返回所有书名包含关键字的图书(不区分大小写)。
    • searchByAuthor(string $author): array:返回所有作者姓名包含搜索词的图书(不区分大小写)。
    • getAvailableBooks(): array:仅返回当前可以借阅的图书。

    使用 array_filter 配合箭头函数和 stripos 进行不区分大小写的匹配。请记住,如果找不到匹配项,stripos 会返回 false,因此要检查 !== false。

  • main.php:引入 Library 文件。你会收到两个输入:一个搜索关键字和一个作者姓名。

    创建一个 Library,并添加以下 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",书名:"Web Development",作者:"Alice Brown"

    使用 ID 为 1、姓名为 "TestUser" 的 User,借阅 ISBN 为 "978-1" 的图书。

    然后执行以下搜索并打印结果:

    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:将这 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",书名:"Web Development",作者:"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 在线编译器