[英]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.