php - 尝试根据 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 看起来不错。
解决方案
好吧,你有点搞错了。
您在第一行中正确获取了代码,但是随后您正在创建一堆不同的数组,每个数组都包含一个可能的代码。然后您正在检查每个数组是否存在,并且由于您刚刚创建它们,它们确实存在,因此您的 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
并执行第一个块。
推荐阅读
- r - 在尝试进行有效的年龄计算时,我在 R 中遇到了这个错误
- flutter - 如何在颤动中拉动刷新网页视图?带刷新指示器
- r - 删除单个字符而不更改 r 数据框中的数字
- python - 如何使用 pathlib 处理以 ~ 开头的路径?
- typescript - Typescript 接口上的类型推断
- javascript - Context.provider 用它包装我的应用程序组件时抛出错误
- rust - 使用 Rust 宏简化“匹配”
- java - 使用firebase时如何检查特定文档中是否存在字段?
- css - 文本没有换行到下一行 - 特别是在 IE 中
- javascript - 为什么 Uncaught TypeError: Cannot set property 'innerHTML' of null 显示即使 id 在和 js 中相同?