Menu
CoddyTech

Chức năng tìm kiếm

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 85 trên 91.

challenge icon

Thử thách

Dễ

Hãy nâng cấp hệ thống quản lý thư viện bằng cách bổ sung chức năng tìm kiếm. Người dùng cần dễ dàng tìm sách, dù họ đang tìm một nhan đề cụ thể, duyệt sách theo tác giả hay kiểm tra những sách hiện có để mượn.

Bạn sẽ sắp xếp code trong bốn tệp:

  • Book.php: Lớp Book với các thuộc tính chỉ đọc (isbn, title, author), một thuộc tính riêng tư $isAvailable có giá trị ban đầu là true và các phương thức: isAvailable(), markAsBorrowed() và markAsReturned().
  • User.php: Thêm tệp Book. Lớp User của bạn có các thuộc tính chỉ đọc (id, name), một mảng riêng tư $borrowedBooks, hằng số MAX_BOOKS có giá trị 3 và các phương thức: getBorrowedBooks(), canBorrow(), addBook(Book $book) và removeBook(string $isbn).
  • Library.php: Thêm tệp User. Mở rộng lớp Library với các chức năng hiện có cùng ba phương thức tìm kiếm mới:
    • searchByTitle(string $keyword): array: trả về tất cả sách có nhan đề chứa từ khóa (không phân biệt chữ hoa chữ thường)
    • searchByAuthor(string $author): array: trả về tất cả sách có tên tác giả chứa cụm từ tìm kiếm (không phân biệt chữ hoa chữ thường)
    • getAvailableBooks(): array: chỉ trả về những sách hiện có để cho mượn

    Dùng array_filter với hàm mũi tên và stripos để so khớp không phân biệt chữ hoa chữ thường. Hãy nhớ rằng stripos trả về false khi không tìm thấy kết quả, vì vậy hãy kiểm tra !== false.

  • main.php: Thêm tệp Library. Bạn sẽ nhận hai đầu vào: từ khóa tìm kiếm và tên tác giả.

    Tạo một Library và thêm bốn cuốn sách sau:

    • ISBN: "978-0", nhan đề: "PHP Basics", tác giả: "John Smith"
    • ISBN: "978-1", nhan đề: "Advanced PHP", tác giả: "Jane Doe"
    • ISBN: "978-2", nhan đề: "Python Guide", tác giả: "John Smith"
    • ISBN: "978-3", nhan đề: "Web Development", tác giả: "Alice Brown"

    Mượn sách có ISBN "978-1" bằng cách dùng một User có ID 1 và tên "TestUser".

    Sau đó thực hiện các tìm kiếm sau và in kết quả:

    1. Tìm theo nhan đề bằng đầu vào thứ nhất, in nhan đề của từng sách khớp trên một dòng mới
    2. Tìm theo tác giả bằng đầu vào thứ hai, in số lượng sách khớp
    3. Lấy danh sách sách hiện có và in số lượng

    Định dạng đầu ra:

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

Thử thách này minh họa cách kết hợp array_filter với stripos để tạo chức năng tìm kiếm mạnh mẽ, dễ dùng. Việc so khớp không phân biệt chữ hoa chữ thường giúp người dùng không cần lo về cách viết hoa chính xác khi tìm kiếm.

Tự làm thử

<?php

require_once 'Library.php';

// Đọc dữ liệu đầu vào
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));

// TODO: Tạo một instance của Library

// TODO: Thêm bốn cuốn sách vào thư viện:
// ISBN: "978-0", Tiêu đề: "PHP Basics", Tác giả: "John Smith"
// ISBN: "978-1", Tiêu đề: "Advanced PHP", Tác giả: "Jane Doe"
// ISBN: "978-2", Tiêu đề: "Python Guide", Tác giả: "John Smith"
// ISBN: "978-3", Tiêu đề: "Web Development", Tác giả: "Alice Brown"

// TODO: Tạo một User có ID 1 và tên "TestUser", rồi đăng ký người dùng đó

// TODO: Mượn cuốn sách có ISBN "978-1"

// TODO: Tìm theo tiêu đề bằng $searchKeyword và in kết quả
echo "Title matches:\n";
// In tiêu đề của mỗi cuốn sách khớp trên một dòng mới

// TODO: Tìm theo tác giả bằng $authorName và in ra số lượng kết quả
echo "Author matches: " . /* đếm tại đây */ "\n";

// TODO: Lấy các cuốn sách hiện có và in ra số lượng
echo "Available: " . /* đếm tại đây */ "\n";

?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online