Если у меня есть массив, полный информации, есть ли способ по умолчанию для возвращаемых значений, если ключ не существует?
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 .