首页 > 解决方案 > 尝试根据 2 个字母代码显示完整的大陆名称

问题描述

我需要显示网站访问者所在的大陆。我正在使用 geoip 功能来提取 2 个字母代码,我可以很容易地开始工作。但是,仅向网站访问者显示亚洲的“AS”显然是不可取的。所以我正在尝试转换它。这就是我想要做的。. .

<?php
$continent = geoip_continent_code_by_name($_SERVER['REMOTE_ADDR']);


$africa = array('AF');
$antarctica = array('AN');
$asia = array('AS');
$europe = array('EU');
$northamerica = array('NA');
$oceania = array('OC');
$southamerica = array('SA');


if ($africa) {
    echo 'Africa';
}
elseif ($antarctica) {
    echo 'Antarctica';
}
elseif ($asia) {
    echo 'Asia';
}
elseif ($europe) {
    echo 'Europe';
}
elseif ($northamerica) {
    echo 'North America';
}
elseif ($oceania) {
    echo 'Australia and Oceania';
}
elseif ($southamerica) {
    echo 'South America';
}

else {
    echo '';
}

?>

无论站点访问者在哪里,它都只会显示“非洲”,因此它会卡在那里。我正在阅读 PHP 教程,但无法弄清楚我做错了什么。据我所知,我的 if、else 和 elsif 看起来不错。

标签: phpgeoip

解决方案


好吧,你有点搞错了。

您在第一行中正确获取了代码,但是随后您正在创建一堆不同的数组,每个数组都包含一个可能的代码。然后您正在检查每个数组是否存在,并且由于您刚刚创建它们,它们确实存在,因此您的 IF 块将在第一次检查时停止并输出 Africa。

您要做的是创建一个数组,其中包含所有代码作为键,输出名称作为值,然后只需使用从 $_SERVER 获得的代码从该数组返回匹配的值。(我从手册中得到了代码列表)

$continent = geoip_continent_code_by_name($_SERVER['REMOTE_ADDR']);

$continents = [
    'AF' => 'Africa', 
    'AN' => 'Antarctica', 
    'AS' => 'Asia', 
    'EU' => 'Europe', 
    'NA' => 'North America', 
    'OC' => 'Oceania', 
    'SA' => 'South America', 
];

echo $continents[$continent];

值得稍微解释一下为什么您的 IF 块以它的方式运行。PHP 是松散类型的,这意味着您不必显式设置变量的类型。所以当 PHP 遇到一个变量时,它必须猜测如何使用它。因此,当您说 时if($africa),php 试图$africa在布尔问题的上下文中理解,并且由于它确实存在并且不是 0 或 false,它会将其视为TRUE并执行第一个块。


推荐阅读