[英]My PHP foreach commands only act on the last item of the array!
我从文本字段获取输入,将每一行变成数组中的一个值,然后使用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
输入最后一行的两个字母的代码! 我快疯了,以前有人看过吗?
试试这样的东西...
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 />";
}
并确保您的数据存在...
您到底有什么问题? 您说它仅将$country
设置为最后一行的两个字母的代码,但是它会在此之前打印出所有代码吗?
这应该很明显,但是如果循环结束后仅遇到$country
的值问题,那么您应该意识到$country
变量在循环的每次迭代中都将被覆盖,因此将仅保存来自循环结束时的最后一次迭代。
如果问题是您的循环没有打印每个代码,那么这听起来像是一个数据问题,您需要向我们显示数组中的值才能确定问题。
您可能遇到的一种数据问题是以下行:
$countryinp = array_filter($countryinp, 'trim');
我认为这行的目的是将trim
函数应用于数组中的每个元素,但这不是array_filter
所做的。 array_filter
的功能是将数组中的每个元素传递给回调函数。 该函数检查元素的内容,如果应保留内容,则返回true
如果应从数组中滤除该元素,则返回false
。
当将trim
传递给array_filter
,唯一发生的事情是将删除任何为空或仅包含空格的数组元素。 这是因为修剪此类元素后,它们为空。 PHP将空字符串解释为false
并将其从数组中删除。
这可能会导致if
语句出现问题,因为如果$code
包含例如“ Afghanistan”(注意尾随空格),则它将不会被if
语句捕获,因为字符串不匹配。
您只需运行$code = trim($code);
行会更好$code = trim($code);
在foreach
循环的开始。
另外,您的代码对我来说有点难看。 如果您要一遍又一遍地检查相同的变量(即重复执行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) // #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所述,您每次迭代都要重置$ country的值
在这里,您可以取消设置$ code的值,这不是必需的,$ code仅在foreach()内部可见,并且当代码存在foreach循环时会自动取消设置。
希望能有所帮助。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.