PHP中如何用str_starts_with结合foreach与数组判断手机号所属国家
解决PHP中用str_starts_with匹配多长度电话代码的问题
你的问题核心是没有对str_starts_with的返回结果做判断,也没在匹配到后终止循环,导致无论是否匹配都输出所有国家项。另外需要注意:如果存在不同长度的电话代码(比如1位、2位、3位),要优先匹配更长的代码,避免短代码提前匹配导致错误。
修改后的代码实现
$tel = '+33601020304'; // 预处理号码:移除非数字字符,再去除开头的0 $tel = preg_replace('/[^0-9]/', '', $tel); $tel = ltrim($tel, '0'); // 电话代码与国家映射,包含不同长度的代码示例 $tel_codes = [ '32' => '比利时', '33' => '法国', '34' => '西班牙', '41' => '瑞士', '44' => '英国', '49' => '德国', '353' => '爱尔兰', // 新增3位代码示例 '1' => '美国/加拿大' // 新增1位代码示例 ]; // 按代码长度从长到短排序,优先匹配更长的代码 uksort($tel_codes, function($a, $b) { return strlen($b) - strlen($a); }); $matched_country = false; foreach ($tel_codes as $code => $country) { if (str_starts_with($tel, $code)) { $matched_country = $country; break; // 匹配到后立即终止循环,避免多余判断 } } // 根据匹配结果输出 if ($matched_country) { echo "匹配到的国家:{$matched_country}"; } else { echo "错误:未找到对应的电话代码"; }
关键修改点说明
- 添加匹配判断与循环终止:在
foreach中用if判断str_starts_with的返回值,匹配到后记录国家名称并执行break停止循环,避免输出所有项。 - 代码排序处理:用
uksort对电话代码数组按键的长度降序排序,确保更长的代码先被检查(比如号码是353xxxx时,会先匹配353而不是可能存在的35)。 - 结果输出逻辑:循环结束后根据是否找到匹配项,输出对应国家或错误信息。
测试结果
对于输入+33601020304,预处理后得到33601020304,会匹配到33对应的法国,输出:
匹配到的国家:法国
如果输入一个不在列表中的号码(比如+8613800138000),则输出:
错误:未找到对应的电话代码
内容的提问来源于stack exchange,提问作者eyescrime13
相关产品推荐
相关产品推荐

