3

特定の文字列に 2 つの文字列が含まれているかどうかを効率的に判断するにはどうすればよいですか?

たとえば、次の文字列が与えられたとしますabc-def-jk-l。この文字列には、 で区切られた 2 つの文字列が含まれている-か、一致しません。マッチングの可能性は次のとおりです。

Possible Matches for "abc-def-jk-l" :
abc           def-jk-l
abc-def       jk-l
abc-def-jk    l

さて、一致させる文字列の列は次のとおりです。

Column I       Column II
-------        -------
1. abc-def     A. qwe-rt
2. ghijkl      B. yui-op
3. mn-op-qr    C. as-df-gh
4. stuvw       D. jk-l

指定された文字列が上の列の 2 つの文字列と一致するかどうかを効率的に確認するにはどうすればよいですか? (上記は一致 - 一致abc-defおよびjk-l)

いくつかの例を次に示します。

abc-def-yui-op   [MATCH - Matches 1-B]
abc-def-zxc-v    [NO MATCH - Matches 1, but not any in column II.]
stuvw-jk-l       [MATCH - Matches 4-D]
mn-op-qr-jk-l    [Is this a match?]

さて、上記の文字列が与えられた場合、どうすれば一致を効率的に判断できるでしょうか? (列 i と ii にはそれぞれ、関連するテーブルのインデックス付き列に何百万もの行があるため、効率が重要です!)

UPDATE:順序は常に i 列、次に ii 列です。(または「一致しない」、つまり、1 つの列のみに一致するか、まったく一致しないことを意味する可能性があります)

ここに役立ついくつかのphpがあります:

<?php

$arrStrings = array('abc-def-yui-op','abc-def-zxc-v','stuvw-jk-l','stuvw-jk-l');

foreach($arrStrings as $string) {
    print_r(stringMatchCheck($string));
}

function stringMatchCheck($string) {

   $arrI = array('abc-def','ghijkl','mn-op-qr','stuvw');
   $arrII = array('qwe-rt','yui-op','as-df-gh','jk-l');

   // magic stackoverflow help goes here!

    if ()
        return array($match[0],$match[1]);
    else
        return false;

}

?>
4

2 に答える 2

2

PHP のstrpos(). $arrIin $stringusingからのエントリが見つかるまでループstrpos()し、 for についても同じことを行い$arrIIます。

詳細strpos(): http://php.net/manual/en/function.strpos.php

編集:

私が話していることを理解するのを助けるために、ここにあなたの機能があります:

function stringMatchCheck($string) {

    $arrI = array('abc-def','ghijkl','mn-op-qr','stuvw');
    $arrII = array('qwe-rt','yui-op','as-df-gh','jk-l');

    $match = array(NULL, NULL);

    // get match, if any, from first group    
    for ($i=0; $i<count($arrI) && !is_null($match[0]); $i++) {
        if (strpos($string,$arrI[$i]) !== false) {
            $match[0]=$arrI[$i];
        }
    }

    if (!is_null($match[0])) {
        // get match, if any, from second group group    
        for ($i=0; $i<count($arrII) && !is_null($match[1]); $i++) {
            if (strpos($string,$arrII[$i]) !== false) {
                $match[1]=$arrII[$i];
            }
        }
    }


    if (!is_null($match[0]) && !is_null($match[1])) {
        return $match;
    } else {
        return false;
    }
}
于 2012-06-27T16:06:28.357 に答える
1

効率を上げるために、各列のすべてのエントリをループするのではなく、文字列を可能な限り多くの異なる単語に分割し、すべての単語の組み合わせを検索します。基本的に、可能な一致として言及したもの。

$words = explode("-", $string);
$end = count($words) - 1;

for ( $i = 1; $i < $end; $i++ ) {
    $partOne = array_slice($words, 0, $i);
    $parttwo = array_slice($words, $i);
    $wordOne = implode("-" , $partOne);
    $wordTwo = implode("-" , $partTwo);

    /* SQL to select $wordOne and $wordTwo from the tables */
}
于 2012-06-27T17:22:31.220 に答える