我的PHP foreach命令只对数组的最后一项起作用!

时间:2011-04-16 00:19:28

标签: php arrays foreach explode

我从文本字段中获取输入,将每一行转换为数组中的值,然后使用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设置为输入的最后一行的双字母代码!我疯了,以前有人见过这个吗?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情......

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 />";
}

确保您的数据存在......

答案 1 :(得分:0)

你到底有什么问题?你说它只将$country设置为最后一行的双字母代码,但它是否在此之前打印出所有代码?

这应该是显而易见的,但是如果你在循环结束后只对$country的值有问题,那么你应该意识到在循环的每次迭代中都会覆盖$country变量,因此只会在循环结束时保留最后一次迭代的值。

如果问题是您的循环不是打印每个代码,那么这听起来像是一个数据问题,您需要向我们展示数组中的值以确定问题

您可能遇到的一个可能的数据问题是:

$countryinp = array_filter($countryinp, 'trim');

我认为你对这一行的意图是将trim函数应用于数组中的每个元素,但这不是array_filter的作用。 array_filter的功能是将数组中的每个元素传递给回调函数。该函数检查元素的内容,如果应该保留内容则返回true,如果该元素应该从数组中过滤掉,则返回false

当您将trim传递给array_filter时,唯一发生的事情就是删除任何空元素或仅包含空格的数组元素。这是因为在修剪这些元素之后,它们是空的。 PHP将空字符串解释为false并将其从数组中删除。

这可能会导致if语句出现问题,因为如果$code包含“阿富汗”(请注意尾随空格),那么它就不会被{{1字符串不匹配的语句。

只需在if循环开始时运行$code = trim($code);行,就会好得多。

另外,你的代码对我来说有点难看。如果您只是反复检查相同的变量(即重复的foreach语句),那么您应该使用switch语句:

if ($code == 'Value')

答案 2 :(得分:0)

这段代码可能存在太多逻辑问题

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)(指向下一个 数组中的元素)

  2. $ country重置为''(空 (每次迭代)(你是) 重置$ country value)

  3. $ code =='xxxx' - 在这里你可以使用 switch()语句,两个好处:1) 表达式仅评估一次 然后匹配'案例'和2) 可维护性(如果必须的话) 改变代码中的某些内容...... 更好的解决方案就是简单 具有国家/地区名称的数组作为键 和国家代码作为价值,然后你 可以直接访问国家代码 像这样 $ countryCodes [$国家名称];

  4. 在此您指定当前国家/地区 仅当$ country时$ code到$ country 是空的,但正如#2中提到的那样 正在重置每个国家的$ country值 iteraction

  5. 在这里取消设置$ code的值 这不是必需的,$ code是 只在foreach()和。中可见 代码时自动取消设置 存在foreach循环。

  6. 希望有所帮助。 :)