Начиная с PHP 7, для этих случаев специально разработан новый оператор, который называется Null Coalesce Operator .
Так что теперь вы можете делать:* вместо
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