将“默认”数组与“输入”数组合并? PHP 哪个函数?
Posted
技术标签:
【中文标题】将“默认”数组与“输入”数组合并? PHP 哪个函数?【英文标题】:Merge "Defaults" array with "Input" array? PHP Which Function? 【发布时间】:2013-04-29 19:13:53 【问题描述】:假设您让用户提供信息。
Array 1
但并非全部都是必需的。所以你有默认值。
Array 2
php 是否有一个函数会根据 Array 1
中是否提供 Array 2
的所有数组值而不是空值来覆盖它们?
【问题讨论】:
【参考方案1】:我认为您正在寻找的是 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
【讨论】:
那就太好了! TY【参考方案2】:$defaults = array(
'some_key_1'=>'default_value_1',
'some_key_2'=>'default_value_2',
);
$inputs = array_merge($defaults, $inputs)
请注意,如果 $inputs 数组包含不在 $defaults 数组中的键,它们将被添加到结果中。
【讨论】:
这几乎不会为现有答案添加任何新见解 感谢您可以复制粘贴来使用它 如果 $inputs 数组包含不在 $defaults 数组中的键,它们将被添加到结果中,这是错误的。【参考方案3】:如果您只想保留您期望的选项并放弃其余选项,您可以使用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)
就可以了。
【讨论】:
是的,这个答案是我喜欢的 :) 我也喜欢你添加的注释,这只是当你想删除额外的键时:) PS:我已经添加了文档的链接;)【参考方案4】:array_merge() 正是您要找的。p>
【讨论】:
错了,array_merge 将在非默认数组中添加任何键,您最终可能会得到默认数组中不可用的键 @RiccardoGalli 无论如何都不会使用默认数组中不可用的键,我认为这不是问题。 这更适用于一维数组,或者当使用提供的值完全重写类似数组的默认值时,这是预期的行为。旁注:性能方面,在 PHP 5.6 中比foreach
更快,在 PHP 7 中几乎没有区别。
@jave.web "keys not available in default array are not available Anyways" 你无法真正知道这一点,例如你可能想要存储用户的当前配置,你最终会存储谁知道什么(仅作为示例)。我认为你真的应该避免担心这一点,而只是丢弃意外的键
@RiccardoGalli 我的意思是,当您的设计正确时,这不会打扰您:) 尤其是来自用户的用户配置无论如何都必须准备好:) BTW:那么您有什么建议? :)【参考方案5】:
你可以这样做
foreach($array1 as $key=>$value) $array2[$key]=$value;
【讨论】:
因为这在大多数情况下都有效,所以它直接覆盖$array2
,在这个用例中,它是“默认”数组。这可能是也可能不是预期的行为。以上是关于将“默认”数组与“输入”数组合并? PHP 哪个函数?的主要内容,如果未能解决你的问题,请参考以下文章