问题描述
|
我从文本字段获取输入,将每一行变成数组中的值,然后使用foreach循环运行搜索并替换每个值。代码如下:
$countryinp = trim($_POST[\'country\']);
$countryinp = explode(\"\\n\",$countryinp);
$countryinp = array_filter($countryinp,\'trim\');
foreach($countryinp as $code)
{
$country = \'\';
if( $code == \'Afghanistan\' ) $country = \'AF\';
if( $code == \'Aland Islands\' ) $country = \'AX\';
if( $code == \'Albania\' ) $country = \'AL\';
if( $code == \'Algeria\' ) $country = \'DZ\';
...
if( $country == \'\') $country = $code;
echo \"$country\";
echo \"<br />\";
unset($code);
}
该代码将循环并输出所有输入的列表,但是对于输入的最后一行,它仅将$country
设置为两个字母的代码!我快疯了,以前有人看过吗?
解决方法
您到底有什么问题?您说它仅将
$country
设置为最后一行的两个字母的代码,但是它会打印出之前的所有代码吗?
这应该很明显,但是如果循环结束后ѭ1value的值仅存在问题,那么您应该意识到$country
变量在循环的每次迭代中都会被覆盖,因此将仅保留循环结束时的最后一次迭代。
如果问题是您的循环未打印每个代码,则听起来像是数据问题,您需要向我们显示数组中的值才能确定问题。
您可能遇到的一种数据问题是以下行:
$countryinp = array_filter($countryinp,\'trim\');
我认为这行的目的是将trim
函数应用于数组中的每个元素,但这并不是array_filter
所做的。 ѭ7'的功能是将数组中的每个元素传递给回调函数。该函数检查元素的内容,如果应保留内容,则返回“ 9”,如果应从数组中过滤出该元素,则返回“ 10”。
当您将trim
传递给array_filter
时,唯一发生的是将删除任何为空或仅包含空格的数组元素。这是因为修剪此类元素后,它们为空。 PHP将空字符串解释为false
,并将其从数组中删除。
这可能会导致您的if
语句出现问题,因为如果$code
包含例如\“ Afghanistan \”(请注意末尾的空格),则它不会被if
语句捕获,因为字符串不匹配。
您只需在foreach
循环的开头运行running17ѭ行,就会更好。
另外,您的代码对我来说有点难看。如果您要一遍又一遍地检查相同的变量(即重复的if ($code == \'Value\')
语句),那么您实际上应该使用switch
语句:
switch ($code) {
case \"Afghanistan\":
$country = \'AF\';
break;
case \"Aland Islands\":
$country =\'AX\';
break;
// repeat for other cases
default:
$country = $code;
}
,试试这样的东西...
foreach($countryinp as $code)
{
$code = trim($code);
switch($code){
case \"Afganistan\": $country = \"AF\"; break;
case \"Alanad Islands\": $country = \"AX\"; break;
default: $country = $code;
}
echo $country.\"<br />\";
}
并确保您的数据存在...
,这段代码可能会引发太多逻辑问题
foreach($countryinp as $code) // #1
{
$country = \'\'; // #2
if( $code == \'Afghanistan\' ) $country = \'AF\'; // #3
if( $code == \'Aland Islands\' ) $country = \'AX\';
if( $code == \'Albania\' ) $country = \'AL\';
if( $code == \'Algeria\' ) $country = \'DZ\';
...
if( $country == \'\') $country = $code; #4
echo \"$country\";
echo \"<br />\";
unset($code); // #5
}
$ code是在foreach中可见的变量
范围,赋值为
next($ countryinp)(指向下一个的指针)
数组中的元素)
$ country重置为\'\'(空
值),每次迭代(您是
重置$ country值)
$ code == \'xxxx \'-在这里您可以使用
switch()语句有两个好处:1)
表达式仅计算一次
然后匹配\'case \'和2)
可维护性(如果必须
更改代码中的内容...
更好的解决方案是简单地
具有国家名称为键的数组
和国家/地区代码作为值,那么您
可以直接访问国家代码
像这样
$ countryCodes [$ countryName];
在这里分配当前国家
仅在$ country时将$ code转换为$ country
是空的,但在#2中提到了
正在重置每个国家/地区的美元价值
迭代
在这里您取消设置$ code的值
这是没有必要的,$ code是
仅在foreach()和
代码自动取消设置
存在foreach循环。
希望能有所帮助。 :)