2011-04-16 153 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