поиск по массиву возвращает неверный ключ [дубликат]
На этот вопрос уже есть ответ здесь:
У меня есть такой массив:
$ar = [ 'key1'=>'John', 'key2'=>0, 'key3'=>'Mary' ];
И, если я напишу:
$idx = array_search ('Mary',$ar);
echo $idx;
Я получаю:
key2
Я искал по сети, и это не проблема изоляции. Похоже, что когда ассоциативный массив содержит значение 0, array_search сбой, если строгий параметр не установлен.
Есть также более одного предупреждения об ошибках , все отклоненные с мотивацией: "array_search () делает свободное сравнение по умолчанию".
Хорошо, я решаю свою маленькую проблему, используя строгий параметр...
Но мой вопрос таков: есть достойная, уважительная причина, почему в свободном сравнении
'Mary'==0 или 'two'==0 или это всего лишь очередное php безумие? 4 ответов:
Вам нужно задать третий параметр как
true, чтобы использовать строгое сравнение. Пожалуйста, взгляните на нижеприведенное объяснение:
array_searchиспользует==Для сравнения значений во время поискаФОРМА PHP DOC
Если третий параметр strict имеет значение TRUE, то функция array_search () будет искать идентичные элементы в стоге сена. Это означает, что он также будет проверять типы иголок в стоге сена, и объекты должны быть одинаковыми пример.
Поскольку вторым элементом является
0строка была преобразована в0во время поискаПростой Тест
var_dump("Mary" == 0); //true var_dump("Mary" === 0); //falseРешение используйте опцию
strictдля поиска идентичных значений$key = array_search("Mary", $ar,true); ^---- Strict Option var_dump($key);Вывод
string(4) "key3"
У вас есть 0 (ноль) числовое значение в массиве, и
array_search()выполнить нестрогое сравнение ( = = ) по умолчанию.0 == 'Mary'является true, вы должны передать 3-й параметрarray_search()(true).
Вы просто chnage в вашем массиве в
'key2'=>'0'Вы не даете одинарную или двойную кавычку$ar = [ 'key1'=>'John', 'key2'=>'0', 'key3'=>'Mary' ];Это прекрасно работает
Comments