我从文本字段中获取输入,将每一行转换为数组中的值,然后使用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
设置为输入的最后一行的双字母代码!我疯了,以前有人见过这个吗?
答案 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
}
$ code在foreach中变量可见 范围,赋值为 next($ countryinp)(指向下一个 数组中的元素)
$ country重置为''(空 (每次迭代)(你是) 重置$ country value)
$ code =='xxxx' - 在这里你可以使用 switch()语句,两个好处:1) 表达式仅评估一次 然后匹配'案例'和2) 可维护性(如果必须的话) 改变代码中的某些内容...... 更好的解决方案就是简单 具有国家/地区名称的数组作为键 和国家代码作为价值,然后你 可以直接访问国家代码 像这样 $ countryCodes [$国家名称];
在此您指定当前国家/地区 仅当$ country时$ code到$ country 是空的,但正如#2中提到的那样 正在重置每个国家的$ country值 iteraction
在这里取消设置$ code的值 这不是必需的,$ code是 只在foreach()和。中可见 代码时自动取消设置 存在foreach循环。
希望有所帮助。 :)