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".
我希望你能设法加快你的脚本。
我想使用区号 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".
我希望你能设法加快你的脚本。