Intereting Posts
Composer не получает установленные окна 7 PHP session_start сериализует и блокирует все остальные, использующие один и тот же сеанс CakePHP – запрос возвращает пустое поле, если в нем есть специальный символ Предотвратите ввод пустой формы из отправки пустого значения в базу данных после ее удаления с помощью jquery и ajax Ручной анализ сырых данных multipart / form-data с помощью PHP Загрузка нескольких изображений с одним полем ввода Неустранимая ошибка: допустимый размер памяти 134217728 байтов исчерпан (CodeIgniter + XML-RPC) Jquery if else shuffle цвета (передача переменной) PHPWord: создание арабского текста справа налево PHP sendmail работает в командной строке Ubuntu, но не из файла php Использование .htaccess для установки подкаталога в качестве корневого каталога Неустранимая ошибка: вызов неопределенной функции utf8_substr () Opencart Вызов функции-члена функции count () в булевом фатальном сообщении об ошибке в php Прокси AJAX с PHP, возможно ли это? Laravel Eloquent – Attach vs Sync

Есть ли идиоматический способ получить потенциально неопределенный ключ из массива в PHP?

Народы, я так устал от этого

$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, если фильтр терпит неудачу.