2014-05-19 6 views
9
$arrValue = array('first', 'second'); 
$ret = in_array(0, $arrValue); 
var_dump($ret); 
var_dump($arrValue); 

выше примера дает следующий результат:in_array() всегда возвращает значение TRUE

bool(true) 
array(2) { 
    [0]=> string(5) "first" 
    [1]=> string(6) "second" 
} 

Почему in_array() матчам иглу 0 до любого заданного стога?

+3

См. Первый комментарий здесь: http://nl1.php.net/in_array Добавьте третий параметр 'true' в' in_array', чтобы установить проверку на строгий. – Greggg

+0

0 == 'first'; 0! == 'first'; – Deadooshka

ответ

15

Это потому, что функция использует нестрогое сравнение. Строка в массиве сравнивается с целочисленным 0. Некоторые типажей происходят с потерей данных, и оба считаются тем же:

var_dump(0 == 'first'); // bool(true) 

Так решить эту проблема, вы можете использовать третий параметр и установить его верный запрос строгое сравнение.

$ret = in_array(0, $arrValue, true); 

Имейте в виду, что это строгое строение. В строгом сравнении 0 не равен "0".

Docs: http://nl3.php.net/in_array

+3

Итак, '0 == 'first'' должен любить PHP. –

+0

Можете ли вы сказать, какие касты действительно делают 0 == 'first', спасибо – fast

+1

@ Loïc: [this] (https://eval.in/111886) или [this] (http://3v4l.org/a0nKq) является даже лучше. – DCoder

0

В основном здесь 0 лакомство, как ложное, так что поиск будет происходить как функция in_array поиска ложной между значением массива. Сделайте строку (0) для получения другого выхода. Как php поддержка строгое или не строгое сравнение, поэтому вам нужно передать третье значение true он говорит, чтобы быть строгим, потому что по умолчанию он не является строгим.

Смежные вопросы