将“默认”数组与“输入”数组合并? 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_mergearray_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 哪个函数?的主要内容,如果未能解决你的问题,请参考以下文章

php 函数合并 array_merge 与 + 的区别

将导航行数组与默认值合并

合并 k 排序数组 - 优先队列与传统合并排序合并,何时使用哪个?

PHP合并数组的三种方法的分析与比较

PHP 合并数组 追加数组例子

php数组合并方法array_merge + 排序array_multisort方法