我遇到了PHP字符串比较的问题。它永远不会变成0.下面我试图在cookie中设置一个设置并将其与给定的密钥进行比较,并返回该cookie的值。 cookie看起来像这个console = 1 | userId = 5。该值始终为-180或其他值。我回应它们并且它们是相同的,并且长度是相同的。这可能是编码问题吗?
$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 :(得分:1)
你在for loop中错过 break; !
是的,它可能是编码问题,因为函数strcasecmp()仅适用于Unicode。 UTF-8或UTF-16等多字节字符无法与strcasecmp()进行比较。
此外,strcasecmp()是不区分大小写的函数,因此对其参数使用strtolower()不会更改函数的结果(字符串“example”与“EXAMPLE”m“eXaMPlE”,“ExamPlE”相同等等。)
您应该设置默认结果值(如$res=false;
)以确保在循环后设置结果。
您应该将for loop块替换为foreach 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;
但是为了使这个解决方案更容易,你可以使用这个功能
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;
}
因此,如果您有$parameters
字符串"console=1|userid=8159"
并希望找到$key
字符串"userid"
的值,请将其放入此函数中,它将返回您的结果或<如果$key
列表中未找到$parameters
,则为strong> false 。
实施例
$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 不在 $ parameters 列表中, $ value 会获取结果或返回 false 。