Всегда используйте in_array()
с третьим параметром strict true
:
$arrayWithTrue = ['Andreas', 'Philipp', true];
$arrayWithNull = [1, 2, 3, null];
$arrayWithMinusOne = [-1];
var_dump(in_array('Gary', $arrayWithTrue, true)); // returns bool(false)
var_dump(in_array(0, $arrayWithNull, true)); // returns bool(false)
var_dump(in_array(true, [-1], true)); // returns bool(false)
Итак, когда вы используйте in_array()
с true
в качестве третьего параметра, сравнение между искомым значением и массивом выполняется строго, что означает, что in_array()
работает так, как вы ожидали бы этого.
(Параметр Строгое также описано в документации php.net .)
Без параметра strict установлено to true, сравнение между искомым значением и каждым значением массива выполняется равенством, а не идентификатором. Это означает, что тип значения не имеет значения, и, таким образом, PHP преобразует значения внутри одного и того же типа данных, чтобы иметь возможность их сравнивать.
Это означает, что в первом примере искомое значение 'Gary'
преобразуется в булево, когда его сравнивают с true
, поэтому он приводит к сравнению true
с true
, что, очевидно, true
.
То же самое происходит со вторым массивом , где 0
, наконец, сравнивается с null
, что приводит к true
, хотя 0
, очевидно, не совпадает с null
(это может быть особенно сложно, когда вы работаете с числами и / или результатами функции для Например, где null
может выразить пустое значение, а не 0
).
Третий массив выглядит действительно странным, потому что мы проверяем значение true
в массиве, которое содержит только -1
, но in_array()
все еще возвращает true
для сравнения. В этом случае -1
преобразуется в boolean true
. Таким образом, проблема в обоих направлениях одинакова.
Вы можете найти больше примеров проблемы сравнения в PHP (потому что это то же самое, что ==
/ ===
) в , это переполнение стека answer .
К сожалению, по умолчанию для параметра strict при вызове in_array()
есть ... ну, да, false
. : - / PHP и набирает текст ...
Вы действительно никогда не будете называть in_array()
без параметра strict , установленного на true
, Если у вас нет массивов смешанных типов, и вы проверяете только значения одного типа, in_array()
работает, как и ожидалось. См. Этот пример:
$arrayWithStrings = ['Andreas', 'Philipp', 'Friedrich'];
var_dump(in_array('Gary', $arrayWithStrings)); // returns bool(false)
Итак, по крайней мере, это работает так, как ожидалось. Но, на мой взгляд, гораздо проще просто вызвать in_array()
с strict true
. (Совместим с «проблемой впрыска SQL» ... Просто всегда используйте PDO и подготовленные инструкции, чтобы вы были в безопасности, даже если это запрос без переменных параметров. Вы всегда в безопасности.)
Вы должны обязательно называть in_array()
с strict true
. Но есть один недостаток, хотя я хочу упомянуть (хотя это очевидно). Вы должны обязательно использовать правильные типы при вызове in_array()
:
$arrayWithNumbers = [1, 2, 3];
var_dump(in_array('1', $arrayWithNumbers, true)); // returns bool(false)
Но вы можете просто использовать Type Casting, когда знаете, что сравниваете числа:
$arrayWithNumbers = [1, 2, 3];
var_dump(in_array((int)'1', $arrayWithNumbers, true)); // returns bool(true)
// Comparing false with an empty array
var_dump(in_array(false, [[]])); // returns bool(true)
Ну, да ... Просто используйте его с strict , установленным в true
. ; -)
Небольшой контроль с моей стороны, в моем контроллере, у меня есть:
->addConnections($repository[0]->getIdSite());
Когда это должно быть:
->addConnections($repository[0]->getName());
Я изменил его, теперь он работает. Извините!