我的PHP foreach命令只作用于数组的最后一项


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设置为输入的最后一行的两个字母代码!我要疯了,有人见过这个吗?

试试这样做…

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语句捕获,因为字符串不匹配。

foreach循环的开始运行$code = trim($code);行会更好。

还有,你的代码对我来说有点丑。如果你只是要一遍又一遍地检查相同的变量(即重复的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
}
  1. $code是foreach中可见的变量范围,赋值为Next ($countryinp)(指向Next的指针

  2. $country被重置为"(空)"值)(您是重置$country value)

  3. $code == 'xxxx' -这里你可以使用Switch()语句有两个好处:1)表达式只求值一次然后匹配'case'和2)可维护性(如果有必要的话)更改代码中的某些内容…更好的解决办法是简单地有数组与国家名称作为关键国家代码作为值,然后你可以直接访问国家代码吗像这样$ countryCodes [countryName美元],

  4. 这里指定当前国家$code到$country只有当$country是空的,但正如在#2中提到的你重置$国家价值在每个iteraction

  5. 这里你取消$code的值这不是必须的,$code是只在foreach()和中可见自动取消设置时,您的代码

希望有帮助。:)