Как правильно проверять существование элемента массива?

Главные вкладки

Аватар пользователя slavik.kz slavik.kz 17 сентября 2012 в 10:57

Вопрос довольно нубский, но что-то последнее время всё чаще дает о себе знать, как при темизации, да и вообще, проверять существование элемента массива?

Например, в случае:

if(isset($content['field_myfield']['und'][0]['value']) && $content['field_myfield']['und'][0]['value']!='')){
print $content['field_myfield']['und'][0]['value'];
}

Периодически сыпятся нотайсы: Notice: Undefined index: value, проверишь valueUndefined index: und или Undefined index: field_myfield

Как в общих случаях правильно и коротко всё это проверить?

Комментарии

Аватар пользователя Ch Ch 17 сентября 2012 в 11:23
  • isset() не даёт таких нотайсов, ваша проблема где то в другом месте.
  • Проверить переменную на наличие не пустого значения можно с помощью empty()
  • Весто 'und' пишите LANGUAGE_NONE
  • Извлекать поля из сущности удобно с помощью field_get_items()
  • Для того, чтобы вывести поле в нужном месте используйте render().
Аватар пользователя q2_faith q2_faith 17 сентября 2012 в 12:34

isset вернет notice, если отсутствует ключ в массиве. для меня самого загадка, в чем принципиальное различие. но эмпирически было проверено, что для массивов лучше использовать array_key_exists

Аватар пользователя Ch Ch 17 сентября 2012 в 12:58

"q2_faith" wrote:
isset вернет notice, если отсутствует ключ в массиве

Да не даёт он вроде никаких нотайсов.
<?php
error_reporting(-1);
//$content['field_myfield']['und'][0]['value'] = TRUE;
print isset($content['field_myfield']['und'][0]['value']) ? 'key exists' : 'key doesn\'t exist';
?>

"q2_faith" wrote:
для меня самого загадка, в чем принципиальное различие

isset также проверяет наличие значения у переменной.
<?php
$array['value'] = NULL;
isset($array['value']); // FALSE
array_key_exists('value', $array); // TRUE
?>

"q2_faith" wrote:
но эмпирически было проверено, что для массивов лучше использовать array_key_exists

Да вроде ничем не лучше. Особенно с многомерными массивами.

Аватар пользователя Ch Ch 17 сентября 2012 в 13:34

Кстати, а как проверить с помощью array_key_exists() данную переменную $content['field_myfield']['und'][0]['value'], если переменная $content не инициализированна?

Аватар пользователя q2_faith q2_faith 17 сентября 2012 в 14:03

"Ch" wrote:
в чём удобство array_key_exists() по сравнению с isset()?

нашел)


<?php
$search_array 
= array('first' => null'second' => 4);

// возвращает false
isset($search_array['first']);

// возвращает true
array_key_exists('first'$search_array);
?>

и то же самое для объектов, надо использовать property_exists, если значение поля содержит NULL
upd. надо будет поэкспериментировать и понять почему все таки notice выскакивает при использовании isset

Аватар пользователя q2_faith q2_faith 17 сентября 2012 в 14:34

"Ch" wrote:
Про я уже писал выше. В данном контексте это наоборот не удобство.

скорее всего вопрос именно в инициализации. isset вернет notice, а array_key_exists вернет FALSE

Аватар пользователя Ch Ch 17 сентября 2012 в 14:51

"q2_faith" wrote:
скорее всего вопрос именно в инициализации. isset вернет notice, а array_key_exists вернет FALSE

Можно пример кода, когда isset вернет notice?

Аватар пользователя q2_faith q2_faith 17 сентября 2012 в 14:54

"Ch" wrote:
Можно пример кода, когда isset вернет notice?

к сожалению не могу воспроизвести. как только появится, отпишусь