Проблема о in_array

У меня есть странная проблема о in_array недавно, который я не могу понять. например.

$a = array('a','b','c');
$b = array(1,2,3);

if (in_array(0,$a))
{
    echo "a bingo!\n";
}
else
{
    echo "a miss!\n";
}

if (in_array(0,$b))
{
    echo "b bingo!\n";
}
else
{
    echo "b miss!\n";
}

Я выполнил его на своей лампе и добрался

a bingo!
b miss!

Я прочитал руководство и установил третий параметр $strict как true, затем это работало как ожидалось. Но делает это означает, что я всегда должен устанавливать строгий параметр как верный при использовании in_array? Предложения ценились бы.

С уважением

14
задан Young 21 March 2010 в 05:49
поделиться

3 ответа

Это означает, что вы должны установить для третьего параметра значение true , если вы хотите, чтобы сравнение было не только сравнивают значения, но и типы .

Иначе, при выполнении сравнения существует преобразование типов - см., Например, Преобразование строк в числа .

Фактически, in_array без строгого и со строгим - это просто такая же разница, как между == и === - см. Операторы сравнения .


Это преобразование в большинстве случаев работает нормально ... Но не в том случае, если вы пытаетесь сравнить 0 со строкой, начинающейся с буквы: строка преобразуется в числовое, значение которого равно 0. .

19
ответ дан 1 December 2019 в 10:18
поделиться

В режиме «по умолчанию» для in_array используется свободное сравнение , например == оператор сравнения делает. Это означает, что 0 сравнивается следующим образом:

var_dump(0 == 'a');  // bool(true)
var_dump(0 == 'b');  // bool(true)
var_dump(0 == 'c');  // bool(true)

Теперь оператор свободного сравнения == использует преобразование строки в целое число перед фактическим сравнением значений :

Если вы сравниваете число со строкой или сравнение включает числовые строки, то каждая строка преобразуется в число, и сравнение выполняется численно.

И 'a' , 'b' и 'c' все преобразуются в 0 :

var_dump((int) 'a');  // int(0)
var_dump((int) 'b');  // int(0)
var_dump((int) 'b');  // int(0)

Но когда используя in_array в строгом режиме (установите третий параметр на true ), выполняется строгое сравнение ( === ) , что означает и значение, и тип должны быть равны:

var_dump(0 === 'a');  // bool(false)
var_dump(0 === 'b');  // bool(false)
var_dump(0 === 'c');  // bool(false)

Итак, при использовании in_array в строгом режиме вы получите ожидаемый результат:

var_dump(in_array(0, $a, true));  // bool(false)
6
ответ дан 1 December 2019 в 10:18
поделиться

В вашем первом примере каждое значение массива $ a при преобразовании в числовое равно 0 Вот почему ваш первый пример приводит к «бинго».

Вам не нужно использовать параметр strict, если вы знаете, что полагаетесь на неявное преобразование или что ваши типы данных такие же (например, поиск строки в массиве строк). В противном случае вы должны использовать параметр strict, так же, как вы должны использовать === вместо == при сравнении двух значений, которые должны быть одного типа.

1
ответ дан 1 December 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: