Значения массива PHP по умолчанию, если ключ не существует?

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

function items() { return array( 'one' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), 'two' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), 'three' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), ); } 

И в моем коде

 $items = items(); echo $items['one']['a']; // 1 

Но могу ли я вернуть значение по умолчанию, если я даю ключ, который не существует, например,

 $items = items(); echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99 

Благодаря ?

Я знаю, что это старый вопрос, но мой поиск Google по «значениям по умолчанию для php-массива» привел меня сюда, и я подумал, что опубликую решение, которое я искал, скорее всего, это поможет кому-то другому.

Мне нужен массив со значениями по умолчанию, которые могут быть переопределены пользовательскими значениями. Я закончил использование array_merge .

Пример:

 <?php $defaultOptions = array("color" => "red", "size" => 5, "text" => "Default text"); $customOptions = array("color" => "blue", "text" => "Custom text"); $options = array_merge($defaultOptions, $customOptions); print_r($options); ?> 

Выходы:

 Array ( [color] => blue [size] => 5 [text] => Custom text ) 

Начиная с PHP 7, для этого случая есть новый оператор, называемый Null Coalesce Operator .

Итак, теперь вы можете сделать:

 echo $items['four']['a'] ?? 99; 

вместо

 echo isset($items['four']['a']) ? $items['four']['a'] : 99; 

Есть еще один способ сделать это до PHP 7:

 function get(&$value, $default = null) { return isset($value) ? $value : $default; } 

И без проблем будет работать следующее:

 echo get($item['four']['a'], 99); echo get($item['five'], ['a' => 1]); 

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

 echo get($item['one']['a']['b'], 99); // Throws: PHP warning: Cannot use a scalar value as an array on line 1 

Кроме того, есть случай, когда будет вызвана фатальная ошибка:

 $a = "a"; echo get($a[0], "b"); // Throws: PHP Fatal error: Only variables can be passed by reference 

В финале есть уродливое обходное решение, но работает почти хорошо (проблемы в некоторых случаях, как описано ниже):

 function get($value, $default = null) { return isset($value) ? $value : $default; } $a = [ 'a' => 'b', 'b' => 2 ]; echo get(@$a['a'], 'c'); // prints 'c' -- OK echo get(@$a['c'], 'd'); // prints 'd' -- OK echo get(@$a['a'][0], 'c'); // prints 'b' -- OK (but also maybe wrong - it depends) echo get(@$a['a'][1], 'c'); // prints NULL -- NOT OK echo get(@$a['a']['f'], 'c'); // prints 'b' -- NOT OK echo get(@$a['c'], 'd'); // prints 'd' -- OK echo get(@$a['c']['a'], 'd'); // prints 'd' -- OK echo get(@$a['b'][0], 'c'); // prints 'c' -- OK echo get(@$a['b']['f'], 'c'); // prints 'c' -- OK echo get(@$b, 'c'); // prints 'c' -- OK 

Это должно сделать трюк:

 $value = isset($items['four']['a']) ? $items['four']['a'] : 99; 

Вспомогательная функция была бы полезна, если вам нужно много писать:

 function arr_get($array, $key, $default = null){ return isset($array[$key]) ? $array[$key] : $default; } 

Вы также можете сделать это:

 $value = $items['four']['a'] ?: 99; 

Это соответствует:

 $value = $items['four']['a'] ? $items['four']['a'] : 99; 

Это избавляет от необходимости превращать все заявление в функцию!

Обратите внимание, что это не возвращает 99 тогда и только тогда, когда ключ 'a' не установлен в items['four'] . Вместо этого он возвращает 99 тогда и только тогда, когда значение $items['four']['a'] является ложным (либо отменено, либо ложным значением, например 0).

Не то, что я знаю из.

Вы должны будете проверить отдельно с isset

 echo isset($items['four']['a']) ? $items['four']['a'] : 99; 

Использовать функцию Array_Fill ()

http://php.net/manual/en/function.array-fill.php

 $default = array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ); $arr = Array_Fill(1,3,$default); print_r($arr); 

Это результат:

 Array ( [1] => Array ( [a] => 1 [b] => 2 [c] => 3 [d] => 4 ) [2] => Array ( [a] => 1 [b] => 2 [c] => 3 [d] => 4 ) [3] => Array ( [a] => 1 [b] => 2 [c] => 3 [d] => 4 ) ) 

Вопрос очень старый, но, возможно, мое решение по-прежнему полезно. Для проектов, где мне нужно «if array_key_exists» очень часто, например, Json parsing, я разработал следующую функцию:

 function getArrayVal($arr, $path=null, $default=null) { if(is_null($path)) return $arr; $t=&$arr; foreach(explode('/', trim($path,'/')) As $p) { if(!array_key_exists($p,$t)) return $default; $t=&$t[$p]; } return $t; } 

Затем вы можете просто «запросить» массив следующим образом:

 $res = getArrayVal($myArray,'companies/128/address/street'); 

Это легче читать, чем аналогичный старомодный способ …

 $res = (isset($myArray['companies'][128]['address']['street']) ? $myArray['companies'][128]['address']['street'] : null); 

Я не знаю, как это сделать именно с кодом, который вы предоставили, но вы можете обойти его с помощью функции, которая принимает любое количество аргументов и возвращает параметр, который вы ищете, или значение по умолчанию.

Применение:

 echo arr_value($items, 'four', 'a'); 

или:

 echo arr_value($items, 'four', 'a', '1', '5'); 

Функция:

 function arr_value($arr, $dimension1, $dimension2, ...) { $default_value = 99; if (func_num_args() > 1) { $output = $arr; $args = func_gets_args(); for($i = 1; $i < func_num_args(); $i++) { $outout = isset($output[$args[$i]]) ? $output[$args[$i]] : $default_value; } } else { return $default_value; } return $output; } 

Вы можете использовать DefaultArray из нестандартной библиотеки PHP . Вы можете создать новый ItemArray из своих элементов:

 use function \nspl\ds\defaultarray; $items = defaultarray(function() { return defaultarray(99); }, $items); 

Или верните DefaultArray из функции items() :

 function items() { return defaultarray(function() { return defaultarray(99); }, array( 'one' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), 'two' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), 'three' => array( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, ), )); } 

Обратите внимание, что мы создаем вложенный массив по умолчанию с анонимной функцией function() { return defaultarray(99); } function() { return defaultarray(99); } . В противном случае один и тот же экземпляр объекта массива по умолчанию будет использоваться для всех полей родительского массива.

В PHP7, как отметил Славик, вы можете использовать нулевой коалесцирующий оператор: ??

Ссылка на документы PHP .