PHP:使用 MySQL 数据库将区号与 Phone 号码分开

PHP: Separate Area Code from Phone number with MySQL Database

我想使用区号 mysql 数据库将区号与 phone 号码字符串分开。

例如字符串是0349152023.
最终结果应该是 03491 52023.

为了得到最终结果,我想拆分字符串并在数据库中搜索每个数字。
例如0然后3然后4然后取最后找到的结果。

我目前的代码只是为进一步的操作准备 phone 数字字符串:

$phone1 = preg_replace('/[oO]/', '0', $phone-string);

$phone2 = preg_replace("/[^0-9]/", "", $phone1);

然后我用str_split把字符串剪成碎片:

$searchArray = str_split($phone2);

感谢您的帮助。

第 1 步:select 来自 db 的所有区号并将它们放入数组 $areaCodes

第 2 步:将 $areaCodes 迭代为 $code,并检查电话号码是否以 $code 开头。如果是,创建一个字符串,在代码和数字的其余部分之间有一个空格

$phonenumber = '0349152023';

$preparedPhonenumber = '';
foreach($areaCodes as $code){
    if(str_pos($phonenumber, $code) === 0){
        // phonenumber starts with areacode

        $phoneWithoutCode = substr($phonenumber, strlen($code));
        $preparedPhonenumber = $code.' '.$phoneWithoutCode;

        break;
    }
}
// if one of the areaCodes was 0349,
// the variable $preparedPhonenumber is now '0349 152023'

edit:您可以通过 select 只输入那些以特定字符串开头的区域代码来缩短从 db 返回的区域代码的数量。

让我们假设德国最短的区号是 ​​3 位数字(我认为这是正确的)。

$threeDigits = substr($phonenumber,0,3);
$query = "SELECT * from areacodes
         WHERE code like '".$threeDigits."%'
         ORDER BY CHAR_LENGTH(code) DESC";

这将大大缩小可能的区号数组,从而使脚本更快。

edit 2:在查询中添加了 order by 子句,因此上面的代码将首先检查较长的区号。 (foreach 循环中的 break; 现在是强制性的!)

您可以构建一个包含所有区号的数组。 那么你可以这样写:

foreach ($area_codes as $code) {
  if (substr($phone, 0, strlen($code)) == $code) {
    $phone_string = substr($phone, 0, strlen($code))." ".substr($phone, strlen($code));
  }
}

您显然可以添加一个控制器来验证是否找到区号。

你好 Leonardo Gugliotti 和 Cashbee

我对区域代码进行排序以获得更好的匹配。 php 脚本工作正常,但处理 5000 个 MySQL 条目需要很长时间。是否可以直接在 mySQL 中进行 foreach 搜索?

<?php
$sample_area_codes = array( '0350', '034', '034915', '03491', '0348', '0349', '03491', '034916', '034917',);
sort($sample_area_codes);

$phone_string = '0349152023';

foreach ($sample_area_codes as $code) {
    $subString = substr($phone_string, 0, strlen($code));
    if ($subString == $code) {
        $phone = $subString." ".substr($phone_string, strlen($code));
    }
}

if (!empty($phone)) {
    echo $phone;
}

else {
    echo "No AreaCode found.";
}
?>

输出:034915 2023,正确

单个探针(假设INDEX(area_code)):

 SELECT ...
     FROM AreaCodes
     WHERE area_code < ?
     ORDER BY area_code DESC
     LIMIT 1;

(将 $phone_number 作为字符串绑定到 ? 中)

我认为你最好将你的数据库拆分成一棵树,为每个数字创建一个 table。
所以第三个数字可以指第二个,第四个到第三个,依此类推,直到达到前缀的最大长度。最后一个 table 应包含区域名称。
按照你的例子,假设区号的最大长度是五位数,fifth_digit_table 应该至少有四个字段,如下所示:
编号
IDref
人数
姓名

10条记录可能有相同的IDref,对应第四位的数字“2”,通过fourth_digit_table、three_digit_table等链接到前面的“021”;这些记录中只有一个,数字字段填充“9”,应该有名称"Haan";其他的,如果没有的话,应该有名称 "Solingen".
我希望你能设法加快你的脚本。