У меня есть странная проблема о 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
? Предложения ценились бы.
С уважением
Это означает, что вы должны установить для третьего параметра значение true
, если вы хотите, чтобы сравнение было не только сравнивают значения, но и типы .
Иначе, при выполнении сравнения существует преобразование типов - см., Например, Преобразование строк в числа .
Фактически, in_array
без строгого и со строгим - это просто такая же разница, как между ==
и ===
- см. Операторы сравнения .
Это преобразование в большинстве случаев работает нормально ... Но не в том случае, если вы пытаетесь сравнить 0 со строкой, начинающейся с буквы: строка преобразуется в числовое, значение которого равно 0. .
В режиме «по умолчанию» для 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)
В вашем первом примере каждое значение массива $ a при преобразовании в числовое равно 0 Вот почему ваш первый пример приводит к «бинго».
Вам не нужно использовать параметр strict, если вы знаете, что полагаетесь на неявное преобразование или что ваши типы данных такие же (например, поиск строки в массиве строк). В противном случае вы должны использовать параметр strict, так же, как вы должны использовать === вместо == при сравнении двух значений, которые должны быть одного типа.