Предположим, у меня есть массив $ 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'] не существует, то он ОПРЕДЕЛЕННО не равен 'классике'. Есть ли способ избежать первой проверки существования ключа до проверки его значения?

0
maxedison 20 Май 2011 в 01:13
В некотором смысле хорошо, что предупреждение существует, поскольку автоматическое приведение типов PHP МОЖЕТ вернуться и укусить вас, когда вы имеете дело с 0, '0', '' и null. При сравнении любого из них с несуществующей переменной все будет иметь значение true, что может НЕ быть тем, что вы хотели.
 – 
Marc B
20 Май 2011 в 01:17
Приведенный выше код выдаст предупреждение, если для отчета об ошибках установлено значение «все». Вам нужно использовать isset () или array_key_exists (), как указано в ответах ниже.
 – 
dqhendricks
20 Май 2011 в 01:23

3 ответа

Лучший ответ

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

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

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

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

if(array_key_exists('music', $arr) && $arr['music'] === 'classical'){
    //do something cool
}
3
Naftali 20 Май 2011 в 01:21
Отлично, я подумал, что должен быть способ протестировать и то, и другое одновременно с помощью &&, чтобы избежать ошибки. Я полагаю, что isset лучше использовать хотя бы потому, что он меньше печатает.
 – 
maxedison
20 Май 2011 в 17:44
@maxedison, это правда, но вы должны быть осторожны, если проверяете, есть ли что-то, и null bc, если это так null isset вернет false, тогда как array_key_exists вернет true
 – 
Naftali
20 Май 2011 в 18:23

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

0
jedwards 20 Май 2011 в 01:17

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

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

Это все. Для меня лучшее читаемое решение.

0
fred727 14 Май 2016 в 11:48