可以说你有一个用户提供的信息。用“Input”数组合并“Defaults”数组? PHP哪些功能?
Array 1
但并非全部都是必需的。所以你有默认。
Array 2
确实PHP有,如果他们在Array 1
提供的,而不是空的,将覆盖的基础上Array 2
所有数组值的函数吗?
可以说你有一个用户提供的信息。用“Input”数组合并“Defaults”数组? PHP哪些功能?
Array 1
但并非全部都是必需的。所以你有默认。
Array 2
确实PHP有,如果他们在Array 1
提供的,而不是空的,将覆盖的基础上Array 2
所有数组值的函数吗?
我不确定这些答案中的任何一个是否帮助你(他们并没有帮助我),特别是当你的“虚假”可能是一个以上级别的关联数组时。
我认为你要找的是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
}
检查它出here
你可以做类似
foreach($array1 as $key=>$value) $array2[$key]=$value;
因为这在大多数情况下都能正常工作,所以它直接覆盖'$ array2',在这种情况下,它是“defaults”数组。这可能是也可能不是预期的行为。 – 2017-02-01 23:00:05
array_merge()是你在寻找什么。
这是错的,array_merge会在非默认数组中添加任何键,并且最终可能会导致键在默认数组中不可用 – 2016-02-04 16:09:00
@RiccardoGalli默认数组中不可用的键不会被使用,我不认为这是问题。 – 2017-02-01 21:47:22
这意味着更多的一维数组,或者当使用提供的值完全重写数组类默认值是预期的行为时。旁注:在PHP 5.6中表现的性能比“foreach”更快,在PHP 7中几乎没有差异。 – 2017-02-01 21:48:13
$defaults = array(
'some_key_1'=>'default_value_1',
'some_key_2'=>'default_value_2',
);
$inputs = array_merge($defaults, $inputs)
这几乎没有增加任何新的见解现有的答案 – cfrick 2014-12-09 11:49:25
我明白,你可以复制和粘贴使用此 – 2015-06-01 12:01:24
如果$ inputs数组包含不在$ defaults数组中的键,它们将被添加到结果中,这是错误的。 – 2016-02-04 16:10:01
如果你只是想保持您所期望的选项,并丢弃其余的你可以使用的012组合和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)
将会做得很好。
是的,这个答案是我喜欢的:)另外我喜欢你添加的注释,只有当你想删除额外的键时才有这个:) PS:我已经添加了文档的链接;) – 2017-02-03 12:54:37
这将是伟大的! TY – Orangeman555 2013-12-18 06:47:37