2010-11-11 4 views
1

J'ai besoin de comparer une chaîne saisi d'une URL, une liste des villes dans un DB MySQL, en utilisant PHPComment générer par programme un tableau de toutes les permutations d'un modèle de chaîne?

SELECT 'city' WHERE 'city' IN (" . $citynameArray . ") LIMIT 1; 

$citynameArray est d'être la liste de toutes les permutations possibles de $cityname, où $cityname peut être jusqu'à 5 chaînes séparées par des traits d'union, MAIS 'city' peut utiliser des espaces OU des tirets pour séparer chaque chaîne.

donc 'ville' peut ressembler à un de ces:

  • chaîne
  • string string
  • chaîne de chaîne de chaîne
  • chaîne de chaîne de chaîne de chaîne
  • chaîne de chaîne de chaîne de chaîne de chaîne
  • chaîne de caractères
  • string-string-string
  • chaîne-chaîne-chaîne-chaîne
  • chaîne-chaîne-chaîne-chaîne-chaîne
  • string-string
  • string-string
  • chaîne chaîne chaîne-chaîne
  • chaîne
  • string- string-string
  • chaîne string-string
  • string-string string
  • string-string-string
  • chaîne-chaîne chaîne-chaîne
  • string-chaîne-chaîne
  • chaîne-chaîne chaîne de chaîne chaîne
  • chaîne-chaîne-chaîne chaîne chaîne
  • string-chaîne-chaîne-chaîne

... et ainsi de suite, jusqu'à un maximum de 5 cordes séparées

Dans la grande majorité des cas cependant, « ville » est soit:

  • chaîne
  • chaîne chaîne
  • chaîne-chaîne

ou, moins fréquente:

  • string-string
  • chaîne-chaîne chaîne

Ma question alors, comment puis-je générer le tableau? Et, en utilisant 'LIMIT 1', la requête s'arrêtera-t-elle en boucle dans le tableau dès qu'un résultat est trouvé?

Je vous remercie des idées,

salutations

GJ

+8

Vous devriez vraiment normaliser vos données d'entrée et votre base de données, car une telle requête peut facilement être une surcharge pour votre base de données. – Fge

+0

Pourrions-nous voir quelques exemples de données qui apparaissent réellement dans la base de données et dans l'URL? D'une part, lorsque vous écrivez (par exemple) "string string-string", il n'est pas clair s'il y a un ordre qui compte. D'autre part, nous ne pouvons pas voir le format des données dans la colonne ville et (comme Fge le dit) il peut y avoir une meilleure façon de structurer les données. – outis

+1

Soit de normaliser vos données, comme le suggère @Fge, soit d'utiliser un peu de recherche en texte intégral. Votre recherche devrait être exacte (normalisée) ou floue ("recherche de type Google"), et non brute. – deceze

Répondre

-1

je l'avais espéré élégance, mais cela devra faire.

CAS 1 représente 90% des cas d'utilisation, et la surcharge est négligeable. Le pourcentage de cas d'utilisation se déprécie en CAS 5, ce qui correspond à 1 cas sur 2000. J'ai analysé les modèles réels pour CAS 4, et les modèles ne devaient pas être exhaustifs.

// FIRST, CREATE AN ARRAY OF $LocaleURL PATTERNS, TAKING INTO ACCOUNT THE VARIABLE USE OF HYPHENS 

    $urlCityArray=explode("-",$LocaleURL); 
    $countSegs = (count($urlCityArray)); // how many array elements 

    if ($countSegs == 1) { 
     $urlCityQuery = $urlCityArray[0]; 
    } 
    else if ($countSegs == 2) { 

     $urlCityQuery = $urlCityArray[0] . " " . $urlCityArray[1] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . "-" . $urlCityArray[1]; 

     // city1 city2, city1-city2 
    } 
    else if ($countSegs == 3) { 

     $urlCityQuery = $urlCityArray[0] . " " . $urlCityArray[1] . " " . $urlCityArray[2] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . "-" . $urlCityArray[1] . " " . $urlCityArray[2] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . " " . $urlCityArray[1] . "-" . $urlCityArray[2] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . "-" . $urlCityArray[1] . "-" . $urlCityArray[2]; 

     // city1 city2 city3, city1-city2 city3, city1 city2-city3, city1-city2-city3 
    } 
    else if ($countSegs == 4) { 

     $urlCityQuery = $urlCityArray[0] . " " . $urlCityArray[1] . " " . $urlCityArray[2] . " " . $urlCityArray[3] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . " " . $urlCityArray[1] . "-" . $urlCityArray[2] . " " . $urlCityArray[3] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . "-" . $urlCityArray[1] . "-" . $urlCityArray[2] . "-" . $urlCityArray[3] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . " " . $urlCityArray[1] . " " . $urlCityArray[2] . "-" . $urlCityArray[3]; 

     // city1 city2 city3 city4, city1 city2-city3 city4, city1-city2-city3-city4, city1 city2 city3-city4 
    } 
    else if ($countSegs == 5) { 

     $urlCityQuery = $urlCityArray[0] . " " . $urlCityArray[1] . " " . $urlCityArray[2] . " " . $urlCityArray[3] . " " . $urlCityArray[4] . "', '"; 
     $urlCityQuery .= $urlCityArray[0] . "-" . $urlCityArray[1] . "-" . $urlCityArray[2] . "-" . $urlCityArray[3] . "-" . $urlCityArray[4]; 

     // Notre-dame-de-lile-perrot 
    } 

    SELECT 'city' FROM Cities WHERE 'city' IN (" . $urlCityQuery . ") LIMIT 1; 
+0

Pour mettre en forme des lignes en tant que code, mettez-les en retrait sur quatre espaces. Le bouton "101 \ n010" fera cela pour vous. Cliquez sur le point d'interrogation orange dans la barre d'outils de l'éditeur pour obtenir d'autres conseils de mise en forme. – outis

Questions connexes