Lets say you are having a user provide information.
Array 1
But not all is required. So you have defaults.
Array 2
Does PHP have a function which will overwrite all array values of Array 2
based on if they are supplied in Array 1
, and not empty?
I think what you are looking for is array_replace_recursive
, especially for the case when your "defualts" may be an associative array more than one level deep.
$finalArray = array_replace_recursive(array $defaults, array $inputOptions)
heres an example that takes an optional array of options to a function and does some processing based on the result of those options "opts
" and the defaults
which you specify:
function do_something() {
$args = func_get_args();
$opts = $args[0] ? $args[0] : array();
$defaults = array(
"second_level" => array(
"key1" => "val1",
"key2" => "val2"
),
"key1" => "val1",
"key2" => "val2",
"key3" => "val3"
);
$params = array_replace_recursive($defaults, $opts);
// do something with these merged parameters
}
The php.net reference document is here
$defaults = array(
'some_key_1'=>'default_value_1',
'some_key_2'=>'default_value_2',
);
$inputs = array_merge($defaults, $inputs)
Note that if the $inputs array contains keys not in the $defaults array they will be added in the result.
array_merge() is exactly what you are looking for.
If you just want to keep the options that you expect and discard the rest you may use a combination of array_merge
and array_intersect_key
.
<?php
function foo($options) {
$defaults = [
'a' => 1,
'b' => null,
];
$mergedParams = array_merge(
$defaults,
array_intersect_key($options, $defaults)
);
return $mergedParams;
}
var_dump(foo([
'a' => 'keep me',
'c' => 'discard me'
]));
// => output
//
// array(2) {
// ["a"]=>
// string(7) "keep me"
// ["b"]=>
// NULL
// }
If you instead want to keep any extra key then array_merge($defaults, $options)
will do just fine.
You can just do something like
foreach($array1 as $key=>$value) $array2[$key]=$value;