I currently use this code pattern fairly frequently
if(array_key_exists('possible_key', $array)) {
$my_variable = $array['possible_key'];
} else {
$my_variable = 'my default value';
}
Is there a better way to be writing this?
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It only takes a minute to sign up.
Sign up to join this communityI currently use this code pattern fairly frequently
if(array_key_exists('possible_key', $array)) {
$my_variable = $array['possible_key'];
} else {
$my_variable = 'my default value';
}
Is there a better way to be writing this?
One quick change you can do is making use of ternary operator instead of writing if else block.
$my_variable = array_key_exists('possible_key', $array)
? $array['possible_key']
: 'my default value';
array_key_exists('possible_key', $array)
and isset($array['possible_key'])
?
\$\endgroup\$
– Joseph Silber
Oct 31 '12 at 1:44
$array['possible_key'] = null;
isset($array['possible_key']); /* false */ array_key_exists('possible_key', $array); /* true */
\$\endgroup\$
– Corbin
Oct 31 '12 at 3:01
I would prefer to keep it simple and not to use if else. Just assign it the default value, and change only when the condition meets.
$my_variable = 'my default value';
if(array_key_exists('possible_key', $array)) $my_variable = $array['possible_key'];
class ArrayHelper {
public static function KeyExists($source, $key) {
return isset($source[$key]) || array_key_exists($key, $source);
}
public static function GetValueOrDefault($source, $key, $default) {
return self::KeyExists($source, $key) ? $source[$key] : $default;
}
}
This is from my library it's similar to the other solutions but it's using a little hack: the array_key_exists() is a slow function so i execute first an isset() 'function' and if it's says "yes, it exists" then i don't have to execute the array_key_exists() function. The reason why isset() is not enough is the isset() will return FALSE if the key exists but the value is NULL.
ArrayHelper::GetValueOrDefault()
, ArrayHelper::KeyExists()
, isset()
, array_key_exists
) rather than a ternary calling 1 function (array_key_exists
).
\$\endgroup\$
– jsanc623
Oct 30 '12 at 23:09
isset
being true is sufficient for array_key_exists
to be true. (Not the inverse though -- your method could consist of only the array_key_exists call and have the same functionality. If it consisted of only the isset call, it would not have the same functionality.) Basically your function now is (a and b) or a
(where a = does the key exist
and b = the value is not null
).
\$\endgroup\$
– Corbin
Oct 31 '12 at 3:11
array_key_exists
call is even close to being a bottleneck of an application, something is seriously wrong.
\$\endgroup\$
– Corbin
Oct 31 '12 at 4:54
isset
before array_key_exists
will be slower.
\$\endgroup\$
– Pacerier
Mar 8 '15 at 15:02
Is there an atomic way to check if the value exists by a key AND return the value, so there will be just one query to the array? I think that this was the original idea of the author of the question. In a very large array, all examples here have shown essentially too lookup: for example array_key_exists('possible_key', $array) ? $array['possible_key']
etc...
A better way would be a single operation with the array that would not give a PHP run time warning in the key does not exist.
idx()
with this behavior. docs.hhvm.com/hack/reference/function/HH.idx
\$\endgroup\$
– AaronDanielson
Mar 26 '18 at 17:12
Untested code here as I don't have access to my dev machine, but taking Sky's ternary suggestion above and simplifying it (one empty() call is faster than an array_key_exists (see https://stackoverflow.com/questions/6884609/array-key-existskey-array-vs-emptyarraykey)
$var = empty($array['possible_key']) ? 'default value' : $array['possible_key'];
$array['possible_key']
is set to ''
or 0
, this'll return 'default value'
.
\$\endgroup\$
– Joseph Silber
Oct 31 '12 at 1:45
'0'
, etc, this is shorter and a tiny bit faster. (isset
would probably be a better fit here than empty
by the way. isset
has fewer false negatives in this context.)
\$\endgroup\$
– Corbin
Oct 31 '12 at 3:05
I prefer to use use isset and make little refactor and wrap that code to function/method
function defaultize( $array_var ,$defaul_val ){
if(isset($array_var)) {
$ret = $array_var;
} else {
$ret = 'my default value';
}
return $ret;
}
and then use in code
$my_variable = defaultize($array['possible_key'],'my default_value' );
$my_variable2 = defaultize($array['possible_key2'],'my default_value2' );
$array
seem uninitialized inside the function.
\$\endgroup\$
– palacsint
Oct 30 '12 at 18:52