我想使用区号mysql数据库将区号与电话号码字符串分开。
例如,字符串为0349152023
结果应该是03491 52023
。
为了得到结果,我想分割字符串并搜索数据库中的每个数字
例如0
然后3
然后4
,然后获取最后找到的结果。
我目前的代码只是准备电话号码字符串以进行进一步的操作:
$phone1 = preg_replace('/[oO]/', '0', $phone-string);
$phone2 = preg_replace("/[^0-9]/", "", $phone1);
然后我使用str_split
将字符串剪成碎片:
$searchArray = str_split($phone2);
感谢您的帮助。
答案 0 :(得分:1)
您可以构建一个包含所有区号的数组。 然后你可以这样写:
foreach ($area_codes as $code) {
if (substr($phone, 0, strlen($code)) == $code) {
$phone_string = substr($phone, 0, strlen($code))." ".substr($phone, strlen($code));
}
}
显然,您可以添加一个控制器,以验证是否找到了区号。
答案 1 :(得分:0)
步骤1:从db中选择所有区域代码并将它们放入数组$areaCodes
第2步:将$ areaCodes迭代为$ code并检查phonenumber是否以$ 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'
编辑:您可以通过仅选择以某个字符串开头的那些来缩短从db返回的区域代码量。
让我们假设德国最短的区号是3位数(我认为是正确的)。
$threeDigits = substr($phonenumber,0,3);
$query = "SELECT * from areacodes
WHERE code like '".$threeDigits."%'
ORDER BY CHAR_LENGTH(code) DESC";
这将大大缩小可能的区域代码数组,从而使脚本更快。
编辑 2:在查询中添加order by子句,以便上面的代码首先检查更长的areacodes。 (foreach循环中的break;
现在是强制性的!)
答案 2 :(得分:0)
嗨Leonardo Gugliotti和Cashbee
我对areaCodes进行排序以获得更好的匹配。 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,这是正确的
答案 3 :(得分:0)
单个探测器(假设为INDEX(area_code)
):
SELECT ...
FROM AreaCodes
WHERE area_code < ?
ORDER BY area_code DESC
LIMIT 1;
(将$phone_number
作为字符串绑定到?
)
答案 4 :(得分:0)
我认为你最好将你的数据库分成一个树,为每个数字制作一个表
所以第三个数字可以指第二个数字,第四个数字指的是第三个数字,依此类推,直到达到前缀的最大长度。最后一个表应包括该区域的名称
按照您的示例,假设区号的最大长度为五位数,则fifth_digit_table应至少包含四个字段,如下所示:
ID
IDREF
数
姓名
10条记录可能具有相同的IDref,对应于第四个位置的数字“2”,链接到前一个“021”到第四个_digit_table,三个_digit_table等等;这些记录中只有一个,数字字段填充“9”,应该具有名称“Haan”;其他人,如果没有,应该有“索林根”这个名字 我希望你能设法加速你的剧本。