2013-05-06 5 views

答えて

12

私はこれらの答えのいずれかがあなたの "defualts"が1レベル以上深い連想配列かもしれない場合に特に助けになるとは思っていません。

あなたが探しているものはarray_replace_recursiveだと思います。 HERESに
$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 
} 

それをチェックあなたはちょうどあなたが012の組み合わせを使用することができ、あなたが期待するオプションを維持し、残りの部分を破棄したい場合はhere

+0

それは素晴らしいだろう! TY – Orangeman555

0

あなたはちょうどあなたが探している正確に何である

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

これはほとんどの場合に機能するため、この使用例では「defaults」配列である '$ array2'を直接オーバーライドします。これは、意図された動作であってもなくてもよい。 –

1

array_merge()ような何かを行うことができます。

+0

間違っていると、array_mergeはデフォルト以外の配列にキーを追加し、デフォルトの配列で利用できないキーで終わる可能性があります。 –

+0

@RiccardoGalliデフォルトの配列では使用できないキーは使用されません。問題。 –

+0

これは、1次元配列の場合、または配列のようなデフォルト値を完全に書き換えたときに、指定された値が意図した動作であることを意味します。 Sidenote:PHP 5.6でのパフォーマンスは 'foreach'より速く、PHP 7ではほとんど違いはありませんでした。 –

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

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

これは既存の回答に新しい洞察を追加することはほとんどありません – cfrick

+0

コピー&ペーストでこれを使用することができます。 –

+0

$ inputs配列に$ defaults配列にないキーが含まれていると結果に追加されます。 –

0

アウトおよび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:ドキュメントへのリンクを追加しました;) –

関連する問題