【发布时间】:2013-04-29 19:13:53
【问题描述】:
假设您让用户提供信息。
Array 1
但并非全部都是必需的。所以你有默认值。
Array 2
PHP 是否有一个函数会根据 Array 1 中是否提供 Array 2 的所有数组值而不是空值来覆盖它们?
【问题讨论】:
标签: php arrays merge overwrite
假设您让用户提供信息。
Array 1
但并非全部都是必需的。所以你有默认值。
Array 2
PHP 是否有一个函数会根据 Array 1 中是否提供 Array 2 的所有数组值而不是空值来覆盖它们?
【问题讨论】:
标签: php arrays merge overwrite
我认为您正在寻找的是 array_replace_recursive,尤其是当您的“默认值”可能是一个超过一级深度的关联数组时。
$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参考文档是here
【讨论】:
$defaults = array(
'some_key_1'=>'default_value_1',
'some_key_2'=>'default_value_2',
);
$inputs = array_merge($defaults, $inputs)
请注意,如果 $inputs 数组包含不在 $defaults 数组中的键,它们将被添加到结果中。
【讨论】:
如果您只想保留您期望的选项并放弃其余选项,您可以使用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) 就可以了。
【讨论】:
array_merge() 正是您要找的。p>
【讨论】:
foreach 更快,在 PHP 7 中几乎没有区别。
你可以这样做
foreach($array1 as $key=>$value) $array2[$key]=$value;
【讨论】:
$array2,在这个用例中,它是“默认”数组。这可能是也可能不是预期的行为。