Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

خاصية البحث

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 85 من 91.

challenge icon

التحدي

سهل

دعونا نقوم بتحسين نظام إدارة المكتبة الخاص بنا عن طريق إضافة وظيفة البحث. يحتاج المستخدمون إلى العثور على الكتب بسهولة، سواء كانوا يبحثون عن عنوان محدد، أو يتصفحون حسب المؤلف، أو يتحققون مما هو متاح حالياً للاستعارة.

ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:

  • Book.php — فئة Book الخاصة بك مع خصائص للقراءة فقط (isbn، title، author)، وخاصية خاصة $isAvailable تبدأ بـ true، والأساليب (methods): isAvailable()، markAsBorrowed()، و markAsReturned().
  • User.php — قم بتضمين ملف Book. فئة User الخاصة بك مع خصائص للقراءة فقط (id، name)، ومصفوفة خاصة $borrowedBooks، وثابت MAX_BOOKS بقيمة 3، والأساليب: getBorrowedBooks()، canBorrow()، addBook(Book $book)، و removeBook(string $isbn).
  • Library.php — قم بتضمين ملف User. قم بتوسيع فئة Library الخاصة بك بالوظائف الحالية بالإضافة إلى ثلاثة أساليب بحث جديدة:
    • searchByTitle(string $keyword): array — تعيد جميع الكتب التي يحتوي عنوانها على الكلمة المفتاحية (غير حساس لحالة الأحرف)
    • searchByAuthor(string $author): array — تعيد جميع الكتب التي يحتوي اسم المؤلف فيها على مصطلح البحث (غير حساس لحالة الأحرف)
    • getAvailableBooks(): array — تعيد فقط الكتب المتاحة حالياً للاستعارة

    استخدم array_filter مع الدوال السهمية (arrow functions) و stripos للمطابقة غير الحساسة لحالة الأحرف. تذكر أن stripos تعيد false عندما لا يتم العثور على مطابقة، لذا تحقق باستخدام !== false.

  • main.php — قم بتضمين ملف Library. ستتلقى مدخلين: كلمة مفتاحية للبحث واسم مؤلف.

    قم بإنشاء Library وأضف هذه الكتب الأربعة:

    • 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"

    قم باستعارة الكتاب ذو الرقم الدولي المعياري "978-1" باستخدام User بمعرف 1 واسم "TestUser".

    ثم قم بإجراء عمليات البحث هذه واطبع النتائج:

    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: إضافة الكتب الأربعة إلى المكتبة:
// 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: إنشاء مستخدم بمعرف 1 واسم "TestUser"، وقم بتسجيله

// TODO: استعارة الكتاب ذو الرقم الدولي المعياري (ISBN) "978-1"

// TODO: البحث حسب العنوان باستخدام $searchKeyword وطباعة النتائج
echo "Title matches:\n";
// طباعة عنوان كل كتاب مطابق في سطر جديد

// TODO: البحث حسب المؤلف باستخدام $authorName وطباعة العدد
echo "Author matches: " . /* العدد هنا */ "\n";

// TODO: الحصول على الكتب المتاحة وطباعة العدد
echo "Available: " . /* العدد هنا */ "\n";

?>

جميع دروس Object Oriented Programming