2

我有两张桌子。一个有大量数字的。然后我有另一个带有前缀列表的表( 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++;

}

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

目前它正在返回和空数组。

希望你能帮忙

4

3 回答 3

1

最好的办法是在你的 sql 中加入,而不是在你的 PHP 中进行检查。要加入一个喜欢的人,你可以这样做:

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

关键是LIKE CONCAT(p.prefix, '%')说组合表 where t.numis like prefix%and in MySQL %is a wildcard 因为我们没有在前面放一个通配符,这意味着该t.num列必须以前缀开头

于 2013-07-04T14:31:51.297 回答
1

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

if (false !== strpos($c['num'], $t['prefix'], 0, $length )) {}
于 2013-07-04T14:20:07.700 回答
0

use preg_grep to reduce the amount of looping/search code you have:

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";
    }
}
于 2013-07-04T14:21:48.720 回答