PHPize Online / SQLize Online  /  SQLtest Online

A A A
Share      Blog   Popular
Copy Format Clear
CREATE TABLE personas ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(255) NOT NULL );
Copy Clear
Copy Format Clear
<?php class BusquedaDifusa { /** * Constructor: inicializa la conexión a la base de datos. * * @param string $host Host de la base de datos. * @param string $dbname Nombre de la base de datos. * @param string $username Usuario de la base de datos. * @param string $password Contraseña de la base de datos. */ public function __construct() { } /** * Realiza una búsqueda difusa en la tabla `personas`. * * @param string $busqueda Cadena ingresada por el usuario. * @param float $umbral Similitud mínima aceptada (por defecto, 0.7). * @return array Resultados ordenados por similitud. */ public function buscar($busqueda, $umbral = 0.7) { $stmt = $pdo->query("SELECT id, nombre FROM personas"); $resultados = []; while ($fila = $stmt->fetch(PDO::FETCH_ASSOC)) { $nombre = $fila['nombre']; // Calcular la distancia de Levenshtein $distancia = levenshtein(strtolower($busqueda), strtolower($nombre)); // Calcular la similitud $longitud_max = max(strlen($busqueda), strlen($nombre)); $similitud = 1 - ($distancia / $longitud_max); // Verificar si cumple con el umbral if ($similitud >= $umbral) { $resultados[] = [ 'id' => $fila['id'], 'nombre' => $nombre, 'similitud' => $similitud ]; } } // Ordenar por similitud usort($resultados, function ($a, $b) { return $b['similitud'] <=> $a['similitud']; }); return $resultados; } /** * Cierra la conexión a la base de datos. */ public function cerrarConexion() { } } // Uso de la clase try { // Crear instancia de la clase $busquedaDifusa = new BusquedaDifusa(); // Realizar búsqueda $terminoBusqueda = "brian"; $resultados = $busquedaDifusa->buscar($terminoBusqueda); // Mostrar resultados if (!empty($resultados)) { echo "Resultados encontrados:<br>"; foreach ($resultados as $resultado) { echo "ID: {$resultado['id']}, Nombre: {$resultado['nombre']}, Similitud: " . round($resultado['similitud'] * 100, 2) . "%<br>"; } } else { echo "No se encontraron resultados."; } // Cerrar conexión $busquedaDifusa->cerrarConexion(); } catch (Exception $e) { echo "Ocurrió un error: " . $e->getMessage(); }
Show:  
Copy Clear