假设您让用户提供信息。
Array 1
但并不是所有的都是必需的。所以你有默认值。
Array 2
PHP是否有一个函数,可以根据Array 1
中提供的Array 2
的所有数组值是否为空来覆盖这些值?
我认为您正在寻找的是array_replace_recursive
,尤其是当您的"defalts"可能是一个不止一级深度的关联数组时。
$finalArray = array_replace_recursive(array $defaults, array $inputOptions)
这里有一个例子,它将一个可选的选项数组带到一个函数中,并根据这些选项"opts
"和您指定的defaults
的结果进行一些处理:
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
}
php.net参考文档在这里
如果您只想保留所需的选项并放弃其余选项,则可以使用array_merge
和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
// }
如果您想保留任何额外的密钥,那么array_merge($defaults, $options)
就可以了。
$defaults = array(
'some_key_1'=>'default_value_1',
'some_key_2'=>'default_value_2',
);
$inputs = array_merge($defaults, $inputs)
请注意,如果$inputs数组包含不在$defaults数组中的键,它们将被添加到结果中。
array_merge((正是您想要的。
你可以做一些类似的事情
foreach($array1 as $key=>$value) $array2[$key]=$value;