You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:12