Menu
Coddy logo textTech

Funcionalidad de búsqueda

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 85 de 91.

challenge icon

Desafío

Fácil

Vamos a mejorar nuestro Sistema de Gestión de Bibliotecas añadiendo funcionalidad de búsqueda. Los usuarios necesitan encontrar libros fácilmente, ya sea buscando un título específico, navegando por autor o comprobando qué está disponible actualmente para préstamo.

Organizarás tu código en cuatro archivos:

  • Book.php — Tu clase Book con propiedades de solo lectura (isbn, title, author), una propiedad privada $isAvailable que comienza como true, y los métodos: isAvailable(), markAsBorrowed() y markAsReturned().
  • User.php — Incluye el archivo Book. Tu clase User con propiedades de solo lectura (id, name), un array privado $borrowedBooks, una constante MAX_BOOKS de 3, y los métodos: getBorrowedBooks(), canBorrow(), addBook(Book $book) y removeBook(string $isbn).
  • Library.php — Incluye el archivo User. Amplía tu clase Library con la funcionalidad existente más tres nuevos métodos de búsqueda:
    • searchByTitle(string $keyword): array — devuelve todos los libros donde el título contiene la palabra clave (insensible a mayúsculas y minúsculas)
    • searchByAuthor(string $author): array — devuelve todos los libros donde el nombre del autor contiene el término de búsqueda (insensible a mayúsculas y minúsculas)
    • getAvailableBooks(): array — devuelve solo los libros que están actualmente disponibles para préstamo

    Usa array_filter con funciones de flecha y stripos para la coincidencia insensible a mayúsculas y minúsculas. Recuerda que stripos devuelve false cuando no se encuentra ninguna coincidencia, así que verifica con !== false.

  • main.php — Incluye el archivo Library. Recibirás dos entradas: una palabra clave de búsqueda y un nombre de autor.

    Crea una Library y añade estos cuatro libros:

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

    Toma prestado el libro con ISBN "978-1" usando un User con ID 1 y nombre "TestUser".

    Luego realiza estas búsquedas e imprime los resultados:

    1. Busca por título usando la primera entrada, imprime el título de cada libro coincidente en una nueva línea
    2. Busca por autor usando la segunda entrada, imprime el recuento de libros coincidentes
    3. Obtén los libros disponibles e imprime el recuento

    Formato de salida:

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

Este desafío demuestra cómo array_filter combinado con stripos crea una funcionalidad de búsqueda potente y fácil de usar. La coincidencia insensible a mayúsculas y minúsculas significa que los usuarios no necesitan preocuparse por el uso exacto de mayúsculas al buscar.

Pruébalo tú mismo

<?php

require_once 'Library.php';

// Leer entradas
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));

// TODO: Crear una instancia de Library

// TODO: Añadir los cuatro libros a la biblioteca:
// 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: Crear un Usuario con ID 1 y nombre "TestUser", registrarlo

// TODO: Tomar prestado el libro con ISBN "978-1"

// TODO: Buscar por título usando $searchKeyword e imprimir resultados
echo "Title matches:\n";
// Imprimir el título de cada libro coincidente en una nueva línea

// TODO: Buscar por autor usando $authorName e imprimir el recuento
echo "Author matches: " . /* recuento aquí */ "\n";

// TODO: Obtener libros disponibles e imprimir el recuento
echo "Available: " . /* recuento aquí */ "\n";

?>

Todas las lecciones de Programación Orientada a Objetos