PHP: Проверка значения элемента массива, когда есть вероятность, что этот элемент не существует

#php #arrays #if-statement

#php #массивы #if-оператор

Вопрос:

Предположим, у меня есть массив $ arr. Возможно, что в нем есть элемент с ключом с именем ‘music’ ($arr[‘music’]), и я хочу проверить, равно ли это значение «классическому»:

 if($arr['music'] === 'classical'){
    //do something cool
}
  

Однако, возможно, что $arr не имеет значения с ключом ‘music’. Поэтому, чтобы избежать ошибки PHP, я делаю следующее:

 if($arr['music']){
    if($arr['music'] === 'classical'){
        //do something cool
    }
}
  

Это кажется совершенно нелепым. На МОЙ взгляд, если $arr [‘music’] не существует, то это ОПРЕДЕЛЕННО не равно ‘classical’. Есть ли способ избежать первой проверки наличия ключа перед проверкой его значения?

Комментарии:

1. В некотором смысле, хорошо, что предупреждение существует, поскольку автоматическое приведение типов PHP МОЖЕТ вернуться и укусить вас, когда вы имеете дело с 0 , '0' , '' и null . Сравнение любого из них с несуществующей переменной приведет к тому, что все значения будут равны true, что может быть НЕ тем, что вы хотели.

2. Приведенный выше код выдаст предупреждение, если для вашего сообщения об ошибках установлено значение «все». Вам нужно использовать isset() или array_key_exists(), как указано в приведенных ниже ответах.

Ответ №1:

Если ключ не существует, он выдаст ошибку (или предупреждение).
Итак, для того, чтобы это произошло, вы должны проверить, существует ли он.
Вот два способа сделать это:

Вы можете проверить это с помощью isset() (который будет false, если $arr['music'] == null ):

 if(isset($arr['music']) amp;amp; $arr['music'] === 'classical'){ 
    //do something cool
}
  

Или используйте array_key_exists() :

 if(array_key_exists('music', $arr) amp;amp; $arr['music'] === 'classical'){
    //do something cool
}
  

Комментарии:

1. Отлично, я подумал, что должен быть способ проверить оба одновременно с помощью amp;amp;, который позволил бы избежать ошибки. Я полагаю, что isset лучше использовать хотя бы потому, что он меньше печатается.

2.@maxedison, это правда, но вы должны быть осторожны, если вы проверяете, есть ли там что-то, и null bc, если это есть, null isset вернет false , тогда как array_key_exists вернет true

Ответ №2:

Я думаю, array_key_exists() соответствует вашим потребностям.

Ответ №3:

Есть другое решение. Некоторым людям это не нравится, потому что в нем используется знак «@», но я нахожу его очень читабельным, поэтому использую его.

 if (@$arr['music'] === 'classical') ...
  

Вот и все. На мой взгляд, лучшее читаемое решение.