【问题标题】:Merge "Defaults" array with "Input" array? PHP Which Function?将“默认”数组与“输入”数组合并? PHP 哪个函数?
【发布时间】:2013-04-29 19:13:53
【问题描述】:

假设您让用户提供信息。

Array 1

但并非全部都是必需的。所以你有默认值。

Array 2

PHP 是否有一个函数会根据 Array 1 中是否提供 Array 2 的所有数组值而不是空值来覆盖它们?

【问题讨论】:

    标签: php arrays merge overwrite


    【解决方案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,在这个用例中,它是“默认”数组。这可能是也可能不是预期的行为。
    猜你喜欢
    • 2016-03-25
    • 2016-01-04
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多