2013-05-06 15 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