Default array values if key doesn't exist? Default array values if key doesn't exist? php php

Default array values if key doesn't exist?


I know this is an old question, but my Google search for "php array default values" took me here, and I thought I would post the solution I was looking for, chances are it might help someone else.

I wanted an array with default option values that could be overridden by custom values. I ended up using array_merge.

Example:

<?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);?>

Outputs:

Array(    [color] => blue    [size] => 5    [text] => Custom text)


As of PHP 7, there is a new operator specifically designed for these cases, called Null Coalesce Operator.

So now you can do:

echo $items['four']['a'] ?? 99;

instead of

echo isset($items['four']['a']) ? $items['four']['a'] : 99;

There is another way to do this prior the PHP 7:

function get(&$value, $default = null){    return isset($value) ? $value : $default;}

And the following will work without an issue:

echo get($item['four']['a'], 99);echo get($item['five'], ['a' => 1]);

But note, that using this way, calling an array property on a non-array value, will throw an error. E.g.

echo get($item['one']['a']['b'], 99);// Throws: PHP warning:  Cannot use a scalar value as an array on line 1

Also, there is a case where a fatal error will be thrown:

$a = "a";echo get($a[0], "b");// Throws: PHP Fatal error:  Only variables can be passed by reference

At final, there is an ugly workaround, but works almost well (issues in some cases as described below):

function get($value, $default = null){    return isset($value) ? $value : $default;}$a = [    'a' => 'b',    'b' => 2];echo get(@$a['a'], 'c');      // prints 'c'  -- OKecho get(@$a['c'], 'd');      // prints 'd'  -- OKecho get(@$a['a'][0], 'c');   // prints 'b'  -- OK (but also maybe wrong - it depends)echo get(@$a['a'][1], 'c');   // prints NULL -- NOT OKecho get(@$a['a']['f'], 'c'); // prints 'b'  -- NOT OKecho get(@$a['c'], 'd');      // prints 'd'  -- OKecho get(@$a['c']['a'], 'd'); // prints 'd'  -- OKecho get(@$a['b'][0], 'c');   // prints 'c'  -- OKecho get(@$a['b']['f'], 'c'); // prints 'c'  -- OKecho get(@$b, 'c');           // prints 'c'  -- OK


This should do the trick:

$value =  isset($items['four']['a']) ? $items['four']['a'] : 99;

A helper function would be useful, if you have to write these a lot:

function arr_get($array, $key, $default = null){    return isset($array[$key]) ? $array[$key] : $default;}