尝试根据 2 个字母代码显示完整的大陆名称

Posted

技术标签:

【中文标题】尝试根据 2 个字母代码显示完整的大陆名称【英文标题】:Trying to display full continent name based on 2 letter code 【发布时间】:2021-08-07 15:46:42 【问题描述】:

我需要显示网站访问者所在的大陆。我正在使用 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 看起来不错。

【问题讨论】:

奇怪的是有一个geoip_country_name_by_name 来获取国家name,而不是大陆。 确实,我实际上花了 15 或 20 分钟试图找到与国家全名对应的大陆,我想它一定在某个地方,但正如你所说,它根本不存在。跨度> 您在哪里比较从 IP 查找到数组的给定大陆? if ($africa) 是不恰当的比较 是的,值得稍微解释一下为什么该行会以这种方式运行。 PHP 是松散类型的,这意味着您不必显式设置变量的类型。所以当 PHP 遇到一个变量时,它必须猜测如何使用它。因此,当您说 if($africa) 时,php 会尝试在布尔问题的上下文中理解 $africa,并且由于它确实存在并且不是 0 或 false,因此它返回 true。 【参考方案1】:

好吧,你有点搞错了。

您在第一行中正确获取了代码,但随后您创建了一堆不同的数组,每个数组都包含一个可能的代码。然后您正在检查每个数组是否存在,由于您刚刚创建了它们,它们确实存在,因此您的 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 并执行第一个块。

【讨论】:

效果很好。我当然知道我犯了某种 PHP 新手错误,我在 4 小时内无法弄清楚你在 4 分钟内所做的事情。非常感谢。 没问题。我添加了一点解释,说明为什么您所做的事情不起作用,以及为什么它的行为方式如此,但基本上 $africa 始终存在,因为您明确地创建它,所以 if 块永远不会超过第一个条件.

以上是关于尝试根据 2 个字母代码显示完整的大陆名称的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 中显示完整的国家名称而不是国家代码?

C#比较基于名称未返回完整路径的文件列表

Android:我正在尝试根据他们的显示名称搜索联系人

按字母顺序显示用户的输入名称

在 WPF 数据网格、组合框模板列上单击编辑

无效的字段名称“名称”。字段只能包含字母、数字和下划线,以字母或下划线开头,最多 128 个字符