2011-04-21 17 views
14

Estoy haciendo una aplicación de tienda en línea muy pequeña en PHP. Entonces tengo una serie de mapas en PHP. Quiero buscar una cadena (un producto) en la matriz. Miré array_search en PHP y parece que solo busca coincidencias exactas. ¿Ustedes saben una mejor manera de hacer esta funcionalidad? Dado que esto es una parte muy pequeña de lo que estoy haciendo en realidad, esperaba que hubiera algo integrado. ¿Alguna idea?Buscar una cadena o parte de cadena en PHP

Gracias!

EDIT: La matriz contiene "productos" en este formato:

[6] => SimpleXMLElement Object 
    (
     [@attributes] => Array 
      (
       [id] => 2000-YM 
      ) 

     [Name] => Team Swim School T-Shirt 
     [size] => YM 
     [price] => 15 
     [group] => Team Clothing 
     [id] => 2000-YM 
    ) 

[7] => SimpleXMLElement Object 
    (
     [@attributes] => Array 
      (
       [id] => 3000-YS 
      ) 

     [Name] => Youth Track Jacket 
     [size] => YS 
     [price] => 55 
     [group] => Team Clothing 
     [id] => 3000-YS 
    ) 

así que me preguntaba que pueda hacer una búsqueda como "Equipo" y me volvería primer punto se ve aquí. Estoy basando la búsqueda en el Nombre (de nuevo, esto es solo algo pequeño). Entiendo que puedo encontrar la cadena exacta, solo estoy atrapado en los "mejores resultados" si no puede encontrar el artículo exacto. La eficiencia es buena, pero no necesaria, ya que solo tengo unos 50 elementos, por lo que incluso si uso un algoritmo "lento" no tomará mucho tiempo.

+1

Es posible que desee proporcionar la cadena que está buscando una vez que lleguen las regex reyes y reinas. –

Respuesta

31

array_filter le permite especificar un función personalizada para hacer la búsqueda. En su caso, una función simple que utiliza strpos() para comprobar si la cadena de búsqueda está presente:

function my_search($haystack) { 
    $needle = 'value to search for'; 
    return(strpos($haystack, $needle)); // or stripos() if you want case-insensitive searching. 
} 

$matches = array_filter($your_array, 'my_search'); 

Alternativamente, se puede utilizar una función anónima para ayudar a prevenir la contaminación del espacio de nombres:

$matches = array_filter($your_array, function ($haystack) use ($needle) { 
    return(strpos($haystack, $needle)); 
}); 
+5

Si su '$ needle' es un solo carácter como en mi caso, querrá hacer una verificación estricta en caso de que el índice de posición sea 0 (frente a' false' si no se encuentra una coincidencia): 'return (strpos ($ haystack, $ needle)! == false); ' –

+0

Estoy tratando de averiguar dónde aparece la variable $ haystack, ¿esa es la clave de la matriz? –

0

Puede usuario expresiones regulares en todos y cada elemento de la matriz como

foreach($array as $value) 
{ 
    //... your search statement for $value 
} 
6
foreach($array as $item){ 
    if(strpos($item,"mysearchword")!== false){ 
    echo 'found'; 
    } 
} 

o puede utilizar preg_match de búsqueda más flexible en lugar de strpos.

+0

Muchas gracias. – vanloc

0

iterar a través de la matriz y el uso substr si quieren búsquedas parciales:

http://php.net/manual/en/function.substr.php

esto debería ser suficiente si usted tiene una tienda de "pequeña" ...

+0

'substr()' como el nombre indica se usa para obtener la subcadena. ¿Cómo ayuda eso aquí? ¿Podrías demostrar con un ejemplo? –

1

Por desgracia, la búsqueda es una de las cosas más difíciles de hacer en informática. Si compila para la búsqueda basada en coincidencias de cadenas literales o expresiones regulares (regex), puede descubrir que no estará contento con la relevancia de los resultados que se devuelven.

Si está interesado en arremangarse las mangas y ensuciarse un poco con una solución más sofisticada, probaría la implementación de Zend Lucene (http://framework.zend.com/manual/en/zend.search.lucene.html). Implementé una búsqueda en un sitio con él. Tomó unos días, pero los resultados fueron MUCHO mejores que la solución de 15 minutos de coincidencia literal de cuerdas.

Avíseme si desea más información.

¡La mejor de las suertes!

PS. Aquí hay un ejemplo: http://devzone.zend.com/article/91

1

Creo que la respuesta de Marc B fue un buen punto de partida, pero para mí tuvo algunos problemas. Por ejemplo, debe saber qué es Needle en el "tiempo de compilación" porque no puede cambiar dinámicamente ese valor. también si la aguja apareció al comienzo del elemento de cuerda, actuaría como si no estuviera allí.entonces, después de un poco de experimentación, decidí solucionar los dos problemas. para que no tenga que crear una nueva función para cada aguja diferente que quiera usar más.

function my_search($haystack) 
{ 
    global $needle; 
    if(strpos($haystack, $needle) === false) {return false;} else {return true;} 
} 

y sería llamado como esto:

$needle="item to search for"; 
$matches = array_filter($my_array, 'my_search'); 

y siendo tan aguja es ahora accesible en el mismo alcance que el resto del código se puede juego de agujas a cualquier otra variable de cadena que deseado, incluida la entrada del usuario.

-1

Tengo el mismo problema pero lo he creado. Funciono para buscar en array pasando la matriz, la clave y el valor.

public function searchinarr($array, $key, $value) 
{ 
     $results = array(); 
      for($i=0;$i<count($array);$i++) 
      { 
       foreach($array[$i] as $k=>$val) 
       { 
        if($k==$key) 
        { 
         if(strpos($val,$value)!== false) 
         { 
          $results[] = $array[$i]; 
         } 
        } 
       } 

      } 
      return $results; 
}