簡體   English   中英

我的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設置$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
}
  1. $ code是在foreach范圍內可見的變量,分配有next($ countryinp)的值(指向數組中下一個元素的指針)

  2. $ country在每次迭代中都重置為''(空值)(您正在重置$ country值)

  3. $ code =='xxxx'-在這里您可以使用switch()語句,有兩個好處:1)僅對表達式求值一次,然后與'case'匹配; 2)可維護性(如果您必須在代碼中進行某些更改...更好的解決方案是將國家名稱作為鍵,將國家代碼作為值,然后可以直接訪問國家代碼,例如$ countryCodes [$ countryName];。

  4. 在這里,僅當$ country為空時,才將當前國家/地區的$ code分配給$ country,但是如#2所述,您每次迭代都要重置$ country的值

  5. 在這里,您可以取消設置$ code的值,這不是必需的,$ code僅在foreach()內部可見,並且當代碼存在foreach循環時會自動取消設置。

希望能有所幫助。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM