Сравнение строк PHP не работает - PullRequest
0 голосов
/ 17 апреля 2011

У меня проблема со сравнением строк 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];
                    }
                }
            }

1 Ответ

1 голос
/ 17 апреля 2011

Вам не хватает перерыв; в для цикла !

Да, это может быть проблема кодирования, потому что функция strcasecmp () работаеттолько с Unicode.Многобайтовые символы, такие как UTF-8 или UTF-16, нельзя сравнивать с strcasecmp () .

Кроме того, strcasecmp () является функцией без учета регистра, поэтомуиспользование strtolower () против его параметров не меняет результат функции (строка «пример» такая же, как «ПРИМЕР» m «eXaMPlE», «ExamPlE» и т. д.).

Вы должныустановите значение результата по умолчанию (например, $res=false;), чтобы убедиться, что результат установлен после цикла.

Вы должны заменить для цикла на 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 string "userid", поместите его в эту функцию, и он вернет ваш результат или false , если $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);

И $ value забирает ваш кодult или возвращает false , если $ name нет в списке $ parameters .

...