Народы, я так устал от этого
$value = isset($arr[$key]) ? $arr[$key] : null;
Или это
$value = array_key_exists($key, $arr) ? $arr[$key] : null;
Никто мне не говорит
$arr = array(1); $key = 5; $value = $arr[$key]; // Notice: Undefined offset: 5
У меня бронхит. Разве никто не получил время?
Я мог бы сделать функцию, я думаю …
function array_get(Array $arr, $key, $default=null) { return array_key_exists($key, $arr) ? $arr[$key] : $default ; }
Но это лучший (самый идиоматический) способ?
Более элегантный способ сделать это:
function ifsetor(&$value, $default = null) { return isset($value) ? $value : $default; }
Теперь вы можете просто сделать:
$value = ifsetor($arr[$key]); $message = ifsetor($_POST['message'], 'No message posted');
и т. д. Здесь $value
передается по ссылке, поэтому оно не будет вызывать Уведомление.
Дальнейшее чтение:
Если вам нужно убедиться, что определенные ключи существуют, вы можете создать массив по умолчанию и объединить свой вход (или что-то еще). Таким образом, все необходимые ключи будут существовать, и они будут обновлены, если это возможно:
$defaults = array( 'foo' => '', 'bar' => '' ); $data = array_merge($defaults, $someOtherArray);
Документы для array_merge()
: http://php.net/array_merge
Я считаю это полезным, принимая во внимание флажки в форме HTML, которые могут отображаться или не отображаться в $_GET
или $_POST
.
Обратите внимание, что этот процесс ожидает строковых массивов, а не числовых. См. Документацию для уточнения.
Не забывайте, что функция isset () не возвращает TRUE для ключей массива, которые соответствуют значению NULL , а array_key_exists () . Таким образом, все вышеприведенные ответы не исправляют работу с элементом NULL в массиве. Вы можете проверить мой ответ для ответа на эту ситуацию. Например, у нас был некоторый массив:
$test = array(NULL,'',0,false,'0');
Если мы используем (из ответа выше в этом разделе) функцию:
function ifsetor(&$value, $default = null) { return isset($value) ? $value : $default; }
и попытайтесь получить данные массива:
echo '---------------------'; var_dump($test); echo 'Array count : '.count($test).'<br>'; echo '---------------------'; var_dump(ifsetor($test[0], 'Key not exists')); var_dump(ifsetor($test[1],'Key not exists')); var_dump(ifsetor($test[2],'Key not exists')); var_dump(ifsetor($test[3], 'Key not exists')); var_dump(ifsetor($test[4],'Key not exists')); var_dump(ifsetor($test1[5],'Key not exists')); function ifsetor(&$value, $default = null) { return isset($value) ? $value : $default; }
наш результат:
--------------------- array (size=5) 0 => null 1 => string '' (length=0) 2 => int 0 3 => boolean false 4 => string '0' (length=1) Array count : 5 --------------------- string 'Key not exists' (length=9) //But value in this key of array - NULL! and key exists string '' (length=0) int 0 boolean false string '0' (length=1) string 'Key not exists' (length=9)
Поэтому мы можем проверить его вместе с isset и array_key_exists . Не забывайте, что это массив или нет;
echo '---------------------'; var_dump($test); echo 'Array count : '.count($test).'<br>'; echo '---------------------'; var_dump(array_get($test, 0, 'Key not exists')); var_dump(array_get($test, 1,'Key not exists')); var_dump(array_get($test, 2,'Key not exists')); var_dump(array_get($test, 3, 'Key not exists')); var_dump(array_get($test, 4,'Key not exists')); var_dump(array_get($test, 5,'Key not exists')); //Key not exists var_dump(array_get($test1, 5,'Key not exists')); //This is not array function array_get($arr, $key, $default=null) { if(is_array($arr)){ return isset($arr[$key]) || array_key_exists($key, $arr) ? $arr[$key] : $default; }else{ return 'No array given'; } }
Теперь ответ правильный:
--------------------- array (size=5) 0 => null 1 => string '' (length=0) 2 => int 0 3 => boolean false 4 => string '0' (length=1) Array count : 5 --------------------- null //Perfect - key exists! string '' (length=0) int 0 boolean false string '0' (length=1) string 'No array given' (length=14) string 'Key not exists' (length=14)
Это уже встроенная функция, если вы используете $_GET
, $_POST
, $_COOKIE
, $_SERVER
, $_ENV
, вы можете использовать:
$value = filter_input(INPUT_GET, $key);
Плюс это делает намного больше. Дополнительные фильтры делают его удобным, если вы также хотите проверять или дезинфицировать фильтры в одном и том же задании.
Возвращает – значение запрашиваемой переменной при успешном завершении, FALSE, если фильтр терпит неудачу, или NULL, если переменная variable_name не установлена. Если используется флаг FILTER_NULL_ON_FAILURE, он возвращает FALSE, если переменная не установлена, и NULL, если фильтр терпит неудачу.