如何以编程方式生成字符串模式的所有排列数组?

时间:2010-11-11 23:31:41

标签: php mysql arrays

我需要使用PHP将从URL中获取的字符串与MySQL数据库中的城市列表进行比较

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

$citynameArray$cityname所有可能排列的列表,其中$cityname最多可包含5个以连字符分隔的字符串,但'city'可以使用空格或连字符将每个字符串分开。

所以'城市'可能看起来像这些:

  • 字符串
  • 字符串字符串
  • 字符串字符串
  • 字符串字符串字符串
  • 字符串字符串字符串字符串
  • 字符串字符串
  • 字符串字符串字符串
  • 字符串字符串字符串字符串
  • 字符串字符串字符串字符串字符串
  • string string-string
  • string-string string
  • string-string string string
  • string string-string-string
  • string string string-string
  • string string string-string
  • string-string-string string
  • string-string string-string
  • string-string-string string
  • string-string string string string
  • string-string-string string string
  • string-string-string-string string

......依此类推,最多可分为5个字符串

然而,在绝大多数情况下,“城市”要么是:

  • 字符串
  • 字符串字符串
  • 字符串字符串

或者,不太常见:

  • string-string string
  • string string-string

我的问题是,如何生成数组?并且,通过使用'LIMIT 1',一旦找到结果,查询是否会停止循环遍历数组?

我很欣赏任何见解,

的问候,

GJ

1 个答案:

答案 0 :(得分:-1)

我曾希望优雅,但这必须要做。

CASE 1代表90%的用例,开销可以忽略不计。

用例百分比折旧为案例5,适用于2000个案例中的1个案例。我分析了CASE 4的实际模式,模式并不一定是详尽无遗的。

    // 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;