2017-04-20 5 views
0

Je travaille sur un système de recherche/publicité qui correspond à un groupe d'annonces avec des mots clés. La requête est la chaîne qui est la chaîne de recherche, ce que nous recherchons est la meilleure et la plus efficace pour améliorer le simple « contient » script ci-dessous qui recherche par la requête, mais cherche des mots clés correspond à un ET (& &) explosion. Avec ce script, on pourrait construire soit « IF » ou il pourrait être un « cas » ci-dessous est le code pseudo:ÉLARGI CONTAINS Fonction - PHP chaîne Espace-Délimité requête avec plusieurs mots-clés séparés par des virgules aiguille

$query = "apple berry tomato potato": 

if contains ($query,"tomato") { } 
if contains ($query,"potato,berry") { } 
if contains ($query,"apple,berry") { } 

else i.e. none of the above do { } 

la fonction contient utiliserait strpos mais utiliserait aussi une combinaison d'exploser à distinguer les mots qui sont séparé par des virgules. Donc, Apple, berry serait où une chaîne contient la liste des mots-clés séparés par des virgules.

Quelle serait la meilleure façon d'écrire un script qui contient à travers la recherche chaîne de requête et correspond aux valeurs séparées par des virgules dans le second paramètre? Aimez vos idées. Merci.

est ici un simple classique « contient » la fonction, mais il ne gère pas la séparés par des virgules et d'explosion - fonctionne uniquement avec des mots simples ou expressions

function contains($haystack,$needle) 
{ 
    return strpos($haystack, $needle) !== false; 
} 

Remarque: l'amélioration de la fonction contient devrait recherche la correspondance de la chaîne sur une base ET. Si des virgules existent dans l'aiguille $, elle doit inclure tous les mots-clés pour afficher une correspondance. Le script contient contient est expliqué sur ce poste Check if String contains a given word. Ce que je recherche est une fonction étendue du même nom qui recherche également plusieurs mots-clés, pas seulement un seul mot.

La chaîne de requête $ sera toujours un espace délimité. La chaîne $ needle sera toujours délimitée par des virgules, ou elle pourrait être délimitée par des espaces.

La chose principale est que la fonction fonctionne dans plusieurs directions

Supposons que la requête $ = 'modèle de plan d'affaires' ou $ query = 'modèles pour le plan d'affaires' si vous exécutiez

contient ($ requête, "business plan") ou contient ($ query, "business, plan") les deux tests montreraient une correspondance. La séquence des mots ne devrait pas avoir d'importance.

+0

Qu'avez-vous essayé jusqu'à présent? –

+0

J'ai mis à jour le message et inclus un script contient simple qui est un point de départ pour le script d'explosion plus de luxe qui recherche plusieurs mots-clés. – Viktor

+0

Donc vous cherchez à faire correspondre TOUS les mots séparés par des virgules dans $ query et $ query est toujours délimité par un espace? – AbraCadaver

Répondre

1

Voici une manière simple. Il suffit de comparer le nombre de $needle avec le comte de $needle (s) qui sont en $haystack utilisant array_intersect():

function contains($haystack, $needle) { 
    $h = explode(' ', $haystack); 
    $n = explode(',', $needle); 
    return count(array_intersect($h, $n)) == count($n); 
} 

Vous pouvez éventuellement passer des $needle en tant que tableau et pas besoin de cette explode().

Si vous en avez besoin insensible à la casse:

$h = explode(' ', strtolower($haystack)); 
$n = explode(',', strtolower($needle)); 
+0

Vous roche. J'ai testé la fonction et cela fonctionne parfaitement. Je vous remercie! – Viktor