5
\$\begingroup\$

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?

\$\endgroup\$

6 Answers 6

6
\$\begingroup\$

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';
\$\endgroup\$
3
  • 2
    \$\begingroup\$ Never thought of using multiple lines with the ternary operator before, though I can see how this would be a very long line otherwise (and it does seem more readable like this). Is it considered a best practice to do this? \$\endgroup\$ Oct 30, 2012 at 17:33
  • \$\begingroup\$ Side note: What's the difference between array_key_exists('possible_key', $array) and isset($array['possible_key'])? \$\endgroup\$ Oct 31, 2012 at 1:44
  • 2
    \$\begingroup\$ @JosephSilber $array['possible_key'] = null; isset($array['possible_key']); /* false */ array_key_exists('possible_key', $array); /* true */ \$\endgroup\$
    – Corbin
    Oct 31, 2012 at 3:01
5
\$\begingroup\$

A modern (PHP7+) solution in case you want a default value when either the element is not set or the value is null.

$my_variable = $array['possible_key'] ?? 'my default value';
\$\endgroup\$
1
\$\begingroup\$

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'];
\$\endgroup\$
0
0
\$\begingroup\$

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.

Unfortunately, PHP does not have an atomic check-and-lookup. So, the answer to the author's question is "NO, this is not possible in PHP to check and lookup in one operation".

However, on the question of "is there a better way to be writing this", the answer is "YES, you can avoid repeating string literals and use ternary operator, but there still be two operations with the array". So here is an improved version of the author's code:

$my_key = 'possible_key'; $my_variable = (array_key_exists($my_key, $array)) ? $array[$my_key] : 'my default value';
\$\endgroup\$
1
  • \$\begingroup\$ This re-statement of the question is what I was originally looking for, and what brought me here. It seems a single lookup isn't possible in PHP, but Hack has a built-in idx() with this behavior. docs.hhvm.com/hack/reference/function/HH.idx \$\endgroup\$ Mar 26, 2018 at 17:12
-2
\$\begingroup\$

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']; 
\$\endgroup\$
3
  • 1
    \$\begingroup\$ If $array['possible_key'] is set to '' or 0, this'll return 'default value'. \$\endgroup\$ Oct 31, 2012 at 1:45
  • 1
    \$\begingroup\$ "one empty() call is faster than an array_key_exists" Correct functionality is a lot more important than performance (in this context, though also usually in general). But yes, if he's willing to ignore values containing 0, empty, '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, 2012 at 3:05
  • \$\begingroup\$ Ah...true guys....woops \$\endgroup\$
    – jsanc623
    Oct 31, 2012 at 3:49
-4
\$\begingroup\$

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' );
\$\endgroup\$
3
  • 1
    \$\begingroup\$ defaultize($array['possible_key'],'my default_value' ); <-- if 'possible_key' dows not exists the PHP will throw an E_NOTICE warning and your function body is messed up. \$\endgroup\$
    – Peter Kiss
    Oct 30, 2012 at 18:52
  • \$\begingroup\$ $array seem uninitialized inside the function. \$\endgroup\$
    – palacsint
    Oct 30, 2012 at 18:52
  • \$\begingroup\$ Ups, sorry just fixed that \$\endgroup\$
    – Lacoz
    Oct 30, 2012 at 19:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.