10

假设您让用户提供信息。

Array 1

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

Array 2

PHP是否有一个函数可以覆盖所有数组值,Array 2如果它们是在 中提供的Array 1,而不是空的?

4

5 回答 5

20

我认为您正在寻找的是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 参考文档在这里

于 2013-12-17T04:39:24.783 回答
3
$defaults = array(
    'some_key_1'=>'default_value_1',
    'some_key_2'=>'default_value_2',
);

$inputs = array_merge($defaults, $inputs)

请注意,如果 $inputs 数组包含不在 $defaults 数组中的键,它们将被添加到结果中。

于 2014-12-09T11:00:55.327 回答
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)就可以了。

于 2017-02-02T06:33:14.087 回答
1

array_merge()正是您正在寻找的。

于 2013-05-06T04:35:11.857 回答
0

你可以做类似的事情

foreach($array1 as $key=>$value) $array2[$key]=$value;
于 2013-05-06T04:13:01.053 回答