Значения массива по умолчанию, если ключ не существует?
Если у меня есть массив, полный информации, могу ли я по умолчанию вернуть значения, если ключ не существует?
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
Ответы
Ответ 1
Я знаю, что это старый вопрос, но мой поиск 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
)
Ответ 2
Начиная с 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
Ответ 3
Это должно сделать трюк:
$value = isset($items['four']['a']) ? $items['four']['a'] : 99;
Вспомогательная функция была бы полезна, если вам нужно много писать:
function arr_get($array, $key, $default = null){
return isset($array[$key]) ? $array[$key] : $default;
}
Ответ 4
Вы также можете сделать это:
$value = $items['four']['a'] ?: 99;
Это означает:
$value = $items['four']['a'] ? $items['four']['a'] : 99;
Это избавляет от необходимости привязывать всю инструкцию к функции!
Обратите внимание, что это не возвращает 99 тогда и только тогда, когда ключ 'a'
не установлен в items['four']
. Вместо этого он возвращает 99 тогда и только тогда, когда значение $items['four']['a']
является ложным (либо отменено, либо ложным значением, например 0).
Ответ 5
Не то, чтобы я знал.
Вам нужно будет отдельно проверить isset
echo isset($items['four']['a']) ? $items['four']['a'] : 99;
Ответ 6
Использовать функцию 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
)
)
Ответ 7
Вопрос очень старый, но, возможно, мое решение все еще полезно. Для проектов, где мне очень часто нужно "if array_key_exists", например, для анализа Json, я разработал следующую функцию:
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);
Ответ 8
Я не знаю, как это сделать именно с кодом, который вы указали, но вы можете обойти его с помощью функции, которая принимает любое количество аргументов и возвращает нужный параметр или значение по умолчанию.
Использование:
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;
}
Ответ 9
Вы можете использовать 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); }
. В противном случае один и тот же экземпляр объекта массива по умолчанию будет использоваться для всех полей родительского массива.
Ответ 10
В PHP7, как упоминал Славик, вы можете использовать нулевой коалесцирующий оператор: ??
Ссылка на Документы PHP.
Ответ 11
я думаю, что лучший ответ есть: есть ли лучший способ PHP для получения значения по умолчанию по ключу из массива (словарь)?
я думаю, что я мог бы быть определен как дубликат