2013-05-06 14 views

回答

12

我不确定这些答案中的任何一个是否帮助你(他们并没有帮助我),特别是当你的“虚假”可能是一个以上级别的关联数组时。

我认为你要找的是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

+0

这将是伟大的! TY – Orangeman555 2013-12-18 06:47:37

0

你可以做类似

foreach($array1 as $key=>$value) $array2[$key]=$value; 
+0

因为这在大多数情况下都能正常工作,所以它直接覆盖'$ array2',在这种情况下,它是“defaults”数组。这可能是也可能不是预期的行为。 – 2017-02-01 23:00:05

1

array_merge()是你在寻找什么。

+0

这是错的,array_merge会在非默认数组中添加任何键,并且最终可能会导致键在默认数组中不可用 – 2016-02-04 16:09:00

+0

@RiccardoGalli默认数组中不可用的键不会被使用,我不认为这是问题。 – 2017-02-01 21:47:22

+0

这意味着更多的一维数组,或者当使用提供的值完全重写数组类默认值是预期的行为时。旁注:在PHP 5.6中表现的性能比“foreach”更快,在PHP 7中几乎没有差异。 – 2017-02-01 21:48:13

1
$defaults = array(
    'some_key_1'=>'default_value_1', 
    'some_key_2'=>'default_value_2', 
); 

$inputs = array_merge($defaults, $inputs) 
+0

这几乎没有增加任何新的见解现有的答案 – cfrick 2014-12-09 11:49:25

+0

我明白,你可以复制和粘贴使用此 – 2015-06-01 12:01:24

+0

如果$ inputs数组包含不在$ defaults数组中的键,它们将被添加到结果中,这是错误的。 – 2016-02-04 16:10:01

0

如果你只是想保持您所期望的选项,并丢弃其余的你可以使用的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)将会做得很好。

+1

是的,这个答案是我喜欢的:)另外我喜欢你添加的注释,只有当你想删除额外的键时才有这个:) PS:我已经添加了文档的链接;) – 2017-02-03 12:54:37