поиск по массиву возвращает неверный ключ [дубликат]



На этот вопрос уже есть ответ здесь:



У меня есть такой массив:



$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 безумие?
509   4  

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' ];

Это прекрасно работает

  $ar = [ 'key1'=>'John', 'key2'=>'0', 'key3'=>'Mary' ];

Comments

    Ничего не найдено.