2012-05-19 4 views
0

Массив resAlloc содержит 10 столбцов и 5 строк. Все записи равны 0. Итак, я ожидаю, что следующий оператор IF будет TRUE, но по какой-то причине он ошибочен ... Почему?PHP: If issue issue

if ($resAlloc[$i][$j] != 'ts' && $resAlloc[$i][$j] != 't' && $resAlloc[$i][$j] != 'st') { 
    $count++; 
} 

ответ

3

!= оценивает 0 как false. Используйте !==, который является более строгим.

+0

Как это объясняет проблему? '0! = 'Ts'' и' false! =' Ts'' должны оцениваться как 'true', и поэтому оператор if в целом должен быть истинным. – octern

+0

Неправильно. 'false && false' равно' false'. –

+0

Кому бы ни говорили: почему бы вам не объяснить почему? –

0

IIRC что-то равное 0 с! = Вернет FALSE.

+0

Неправильно. '0! = 1' возвращает' true' (слава богу!). Я думаю, что это проблема с сравнением строк с целыми числами - строки получают приведение к целому нулю, поэтому в итоге все становятся равными! – octern

+0

Я сказал IIRC, точно не был уверен. – alexpja

0

Проблема в том, что вы сравниваете строку и целое число, а PHP «помогает» приведение строки в целое число - целое число. 0!='ts' оценивается как false, потому что сравнение заканчивается после преобразования 0!=0. Вы можете предотвратить это явно обрабатывать содержимое вашего массива в виде строки:

strval($resAlloc[$i][$j]) != 'ts' 

Это будет делать сравнение '0'!='ts', который правильно оценивает в true. Если вы передадите strval() строку, она вернет ее без изменений, поэтому это должно быть безопасно использовать независимо от того, что находится в вашем массиве.

В качестве альтернативы, как сказал Сами Диндан, вы можете просто использовать! ==, который не будет преобразовывать тип.