Я хочу сравнить строки в многомерном PHP-массиве. Я запустил отладчик, и он переходит в условие if, но, на мой взгляд, не должен.

$strEmpty = $this->areStringsEmpty($needle, $haystack[$i]); // FALSE after method call

$one=strcasecmp($haystack[$i][0],$needle[0]); // evaluates to 6 , which shoult be FALSE
$two=strcasecmp($haystack[$i][1], $needle[1]); //evaluates to 2 , which alse should be false

if (!$strEmpty && $one && $two) { // TRUE && FALSE && FALSE
    return TRUE;
}

Почему это так? Я знаю, что могу проверить на 0 в условии, но мне интересно, почему это не делается автоматически.

php
0
user3741086 20 Мар 2017 в 12:51

2 ответа

Лучший ответ

Дело в том, что strcasecmp возвращает числа. Так что будет true, если возврат больше или меньше 0.

Вход:

$var1 = "Hello";
$var2 = "hello2";
if (strcasecmp($var1, $var2) == true) {
    var_dump(strcasecmp($var1, $var2));
}

Выход:

int(-1)

Как видите, это -1, но это правда.

Вы можете просто добавить фигурные скобки вокруг strcasecmp.

$one = (strcasecmp($haystack[$i][0], $needle[0]) == 0);
$two = (strcasecmp($haystack[$i][1], $needle[1]) == 0);

Это даст вам истину, если она равна, ложь, если это не так.

Примере

1
Patrick Mlr 20 Мар 2017 в 10:18

strcasecmp возвращает 0, когда строка соответствует. Чтобы получить логическое true при совпадении строк, вы можете сделать это.

    $one=(strcasecmp($haystack[$i][0],$needle[0]) === 0); //TRUE when === 0
    $two=(strcasecmp($haystack[$i][1], $needle[1]) === 0);  //TRUE when === 0 
2
Ben Hillier 20 Мар 2017 в 10:07