如何将大量字符串与另一个字符串的开头进行比较?

时间:2013-07-04 14:15:57

标签: php string foreach match

我有两张桌子。一个有很多数字。然后,我有另一个表格,其中包含前缀列表(30,000+)。

我需要遍历前缀,看看表1中的任何数字是否都以任何前缀开头。

这是我到目前为止所做的。

$tdata = $r->get_t_data(); //array of prefix
/*
Array
(
[0] => Array
    (
        [prefix] => 101
        [dest] => UK
    )

)
 */

$cdata = $r->get_c_data(); //array of number

/*Array
(
[0] => Array
    (
        [row] => 1
        [num] => 441143610120
    )

)*/

$temp = array();
$i=0;
$time=0;
foreach ($cdata as $ckey => $c) {


    foreach ($tdata as $tkey => $t) {


        $length = strlen($t['prefix']);

        if (strpos($c['num'], $t['prefix'], 0, $length )) {

            $temp[$i]['row']=$c['row'];
            $temp[$i]['prefix']=$t['prefix'];
            $temp[$i]['dialled']=$c['num'];
            $temp[$i]['dest']=$t['dest'];

            break;

        $i++; //increment only if found
        }

    }

    $time++;

}

所以基本上它遍历数字,然后我尝试将数字的第一部分与前缀匹配。

目前正在返回并清空阵列。

希望你能帮忙

3 个答案:

答案 0 :(得分:1)

你的条件if (strpos($c['num'], $t['prefix'], 0, $length ))可以返回0,php会将其解释为false。 strpos应该像这样检查:

if (false !== strpos($c['num'], $t['prefix'], 0, $length )) {}

答案 1 :(得分:1)

最好的办法是在你的SQL中进行连接而不是在PHP中进行检查。要进行类似的联接,您可以这样做:

SELECT * FROM table t JOIN prefixTable p ON t.num LIKE CONCAT(p.prefix, '%')

密钥是LIKE CONCAT(p.prefix, '%'),它说的是t.numprefix%类似的表格,而%中的t.num是一个通配符,因为我们没有放入外卡前面意味着{{1}}列必须以前缀

开头

答案 2 :(得分:0)

使用preg_grep减少您拥有的循环/搜索代码量:

foreach ($table1 as $search) {
    $safe_search = preg_quote($search);
    $matches = preg_grep("/^$safe_search/", $prefix_array);
    if (count($matches) > 0) {
       echo "Found $search in the prefix array\n";
    }
}