Проблемы цикла Foreach в php - PullRequest
       9

Проблемы цикла Foreach в php

7 голосов
/ 26 августа 2011

Вот код, который у меня есть: (p просто echos plus добавляет новую строку)

foreach ($vanSteps as $k => $reqInfo) 
{
    p($k);
    if ('van' == $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
    //do stuff
}

и я получаю этот вывод:

0
The key is the van, continue
1
2
3
van
The key is the van, continue

Почему оператор if возвращает true, если ключ равен 0? Этот цикл foreach обрабатывает логику, которая применяется, когда ключ == 0 (и любой другой ключ, кроме ключа 'van'), и это портит логику, потому что он возвращает true, когда ключ равен 0.

Любая помощь?

Спасибо.

Ответы [ 7 ]

12 голосов
/ 26 августа 2011

Используйте === для этого сравнения. Когда PHP сравнивает строку и целое число, он сначала преобразует строку в целочисленное значение, а затем выполняет сравнение.

См. Операторы сравнения в руководстве.

6 голосов
/ 26 августа 2011

В PHP 'van' == 0 равно true. Это связано с тем, что при использовании == для сравнения строки и числа строка преобразуется в число (как описано во второй ссылке ниже); это делает внутреннее сравнение 0 == 0, что, конечно, true.

Предлагаемая альтернатива для ваших нужд будет состоять в использовании строгого сравнения на равенство, используя ===.

См. Операторы сравнения и Преобразование строк в числа

2 голосов
/ 26 августа 2011

В PHP, когда вы сравниваете 2 типа, он должен конвертировать их в один и тот же тип.В вашем случае вы сравниваете string с int.Внутренне это преобразуется в

if((int)'van'==0)...., а затем if((int)'van'==1)....

(int) «любая возможная строка» будет 0 :) Так что вам нужно либо вручную преобразовать оба значенияк тому же типу, или используйте === в качестве оператора сравнения вместо свободного =.Исключением из этого правила (как указано в комментариях) может быть, если строка начинается с цифры или может быть интерпретирована как число любым способом (1 0002, -1 и т. Д.).В этом случае строка будет интерпретироваться как число, указывающее конец нечислового конца строки

Подробнее см. http://php.net/manual/en/types.comparisons.php.

0 голосов
/ 26 августа 2011

Потому что 'van' == 0 (правда).

Вместо этого вы должны использовать 'van' === 0 (false).

Короче говоря, используйте === вместо ==.

0 голосов
/ 26 августа 2011

Он интерпретирует 'van' как логическое значение (false), значение которого равно 0.

Чтобы проверить точное совпадение типа и значения в PHP, вы должны использовать === вместо ==

0 голосов
/ 26 августа 2011

Прочитайте таблицу Сравнение с различными типами Когда один из операндов является числом, другой операнд также преобразуется в число.Так как 'van' не является числовым именем, он преобразуется в 0. Вы должны использовать оператор === в этом случае, который также проверяет тип переменной

0 голосов
/ 26 августа 2011

Это прекрасно работает:

$array = array(0=>"a",1=>"b","van"=>"booya!");

function p($v){ echo "{$v}<br />"; }

foreach ($array as $k => $reqInfo) 
{
    p($k);
    if ('van' === $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
    //do stuff
}

Вывод:

0
1
van
The key is the van, continue

Обратите внимание на ===.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...