PHP – múltiples consultas de búsqueda (de formulario) en una matriz (de archivo de texto) .. o algo

No sabía exactamente cómo llamar esto … De todos modos:

Tengo un archivo de texto que consiste en:

something;something2;something3;something4\n 

Yo uso un formulario html regular para la entrada de usuario. Entrada de usuario = $ búsqueda. Lo envío a mi función de búsqueda:

 function search($search) { $lin = file('text.txt'); $lines = array_map('strtolower', $lin); $found = false; foreach($lines as $line) { if(strpos($line, $search) !== false) { $found = true; $line = explode(";",$line); $line[1] = ucwords($line[1]); $line[2] = ucwords($line[2]); $line[3] = strtoupper($line[3]); echo "$hit[0] $hit[1] etc"; } } if(!$found) { echo "No matches"; } } 

Esto funciona bien si el usuario solo ingresa una palabra. Digamos que el contenido del archivo es: foo; bar; chuck; made;

Me gustaría que el usuario pueda buscar “foo chuck” y aún así obtener un resultado. Incluso si solo coincide una palabra, la línea debería repetirse (por ejemplo, “foo carl” sigue emitiendo toda la línea).

Pero, de nuevo, si hay un “foo; bar” y un “foo; carl”, no quiero que se muestre foo bar si el usuario busca “foo carl” …

¿Algun consejo?

usa explotar para poner tu cadena en una matriz, luego recorre la matriz y busca un golpe … o mejor aún, usa in_array :

 $string='something;something2;something3;something4'; $array=explode(';',$string); if(in_array('test',$array) || in_array('othertest',$array) || in_array('thirdval',$array)){ ;//there's a match } 

si está tratando con file gran file puede que no sea el mejor enfoque, ya que lee todo el archivo en una matriz y lo guarda en la memoria. Su archivo también se ve como CSV para que pueda usar fgetcsv todo lo que necesita para cambiar es el delimitador

Tratar

 $file = "large_file.txt"; $search = "something2"; var_dump(search($file, $search)); 

Otro uso

 search($file, $search,true); // Multiple Result search($file, $search,true,","); // File has , has delimiter Instead of ; 

Función

 function search($file, $search, $multiple = false, $delimiter = ";") { $handle = fopen($file, "r"); $list = array(); while ( ($data = fgetcsv($handle, 1024, $delimiter)) !== FALSE ) { if (in_array($search, $data)) { if ($multiple) $list[] = $data; else return $data; } } fclose($handle); return $list; } 

Puede tomar la entrada del usuario, dividirla en palabras, normalizarlas de la misma manera que normaliza los contenidos del archivo y ponerlos en una matriz $input .

Luego, para cada fila en el contenido del archivo siga exactamente el mismo procedimiento que termina con una matriz $line .

Según su descripción, un hit de búsqueda ocurre cuando todas las palabras dentro de $input también están presentes dentro de $line , lo que podría expressse como:

 $hit = count(array_intersect($input, $line)) == count($input); 

No se olvide de “recortar” $input y $line usando array_unique para cubrir el caso en que un término de búsqueda aparece más de una vez.

Código de ejemplo:

 function search($search) { // break input into words and normalize // explode() is maybe not going to cut it in production, but it's OK here $search = array_unique(explode(' ', strtolower($search))); $terms = count($search); $lines = file('text.txt'); $found = false; foreach($lines as $line) { // same treatment as for input $line = array_unique(explode(' ', strtolower($line))); if(count(array_intersect($search, $line)) == $terms) { $found = true; $line = explode(";",$line); $line[1] = ucwords($line[1]); $line[2] = ucwords($line[2]); $line[3] = strtoupper($line[3]); echo "$hit[0] $hit[1] etc"; } } }