<?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($host, $dbname, $username, $password)
{
}
/**
* 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();
}