2011-04-16 80 views
0

我遇到了PHP字符串比較問題。它永遠不會是0.下面我試圖獲取cookie中的設置並將其與給定鍵進行比較,並返回該cookie的值。 cookies看起來像這個console = 1 | userId = 5。該值始終是-180或其他值。我將它們回顯出來,它們是一樣的,長度也是一樣的。它可能是一個編碼問題?PHP字符串比較不起作用

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 

      for ($i = 0; $i < count($parameters); $i++) { 
       $parameter = explode('=', $parameters[$i]); 

       if(count($parameter) > 1) { 
        echo strcasecmp(strtolower(trim($parameter[0])), trim(strtolower($name))); 
        if(strcasecmp(strtolower(trim($parameter[0])), trim(strtolower($name))) == 0) { 
         return $parameter[1]; 
        } 
       } 
      } 
+0

第一行之後的'$ parameters'是否包含期望值?你可以發佈var_dump($ parameters)的結果還是僅僅是一個例子? – Wh1T3h4Ck5 2011-04-17 00:00:08

+0

那個'return'代表什麼? – Wh1T3h4Ck5 2011-04-17 00:08:46

+0

由print_r($ parameters)返回數組([0] => console = 1 [1] => userid = 8150),如果通過$請求了返回值,則返回鍵的值,如8150名稱。 – 2011-04-17 01:24:14

回答

1

你錯過了break;for loop

是的,它可能是編碼問題,因爲函數strcasecmp()僅適用於Unicode。多字節字符(如UTF-8或UTF-16)不能與strcasecmp()進行比較。

此外,strcasecmp()是因此使用strtolower()針對它的參數不改變函數的結果(字符串「示例」同「實施例」 M「示例」,「示例」等)不區分大小寫的功能。

您應該設置默認結果值(如$res=false;)以確保結果在循環之後設置。

你應該foreach loop取代for loop塊像這樣的吼叫

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 

    // this will handle result 
    $res = false; 

    foreach ($parameters as $value) { 
    $param = explode('=', $value); 
    if(count($parameter) > 1) { 
     // I guess this line is just for testing result 
     echo "param1=".trim($param[0])."; param2=".trim($name)."; Result=".strcasecmp(trim($param[0]), trim($name)) . "<br />\n"; 

     if(strcasecmp(trim($param[0]), trim($name))) { 
     $res=$param[1]; 
     // you should break here 
     break; 
     } 
     } 
    } 
    // try to output result before (testing purpose only) 
    var_dump($res); 

    return $res; 

但是,爲了使這個解決方案很容易,只要你有$parameters串像"console=1|userid=8159",並且希望您可以使用此功能

function getParamValue($parameters, $key) { 
    $res = false; 
    $plist = explode('|', $parameters); 
    foreach ($plist as $pair) { 
     $element = explode('=', $pair); 
     if (trim($element[0]) == trim($key)) { 
     $res = trim($element[1]); 
     break; 
     } 
     } 
    return $res; 
    } 

所以找到值$key字符串"userid",把它放到這個函數中,它會返回你的結果或者fal se if $key未在$parameters列表中找到。

$parameters = "console=1|userid=8159"; 
    $name = "userid"; 

    echo getParamValue($parameters, $name); 

輸出

8159 

現在你可以寫你的代碼,這樣

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 
$value = getParamValue($parameters, $name); 

而且$值需要你的結果,或者返回如果$ name不在$參數列表中。

+0

工作。我基本上用foreach替換for循環,並保持其餘部分相同,同時刪除較低的字符串(這是從嘗試所有內容中剩下的)。仍然不完全確定什麼是錯,但謝謝。 – 2011-04-17 02:30:09

+0

@Mike,可能是邏輯錯誤,但最重要的是,你有解決方案。我建議使用這個函數,我把它放在我的答案的底部而不是那個foreach塊。 – Wh1T3h4Ck5 2011-04-17 02:39:33