2017-02-16 30 views
1
function doSomething($config = null) { 
    $default = [ 
     'name' => 'Chan', 
     'age' => 36 
    ]; 

    if ($config !== null) { 
     $default = array_merge($default, $config); 
    } 

    var_dump($default); 
} 

doSomething(); // This one get name is chan and age is 36 
doSomething(['age' => 10]); // This one get name is chan and age is 10 

私は一部のパラメータを関数に渡して部分的な更新を行いますが、サブアレイでは機能しません。部分配列を部分的に置き換える方法

function doSomething($config = null) { 
    $default = [ 
     'name' => 'Chan', 
     'age' => 36, 
     'sub' => [ 
      'a' => 1, 
      'b' => 2 
     ] 
    ]; 

    if ($config !== null) { 
     $default = array_merge($default, $config); 
    } 

    var_dump($default); 
} 

doSomething(); // This one sub is ['a' => 1, 'b' => 2] 
doSomething(['sub' => ['a' => 3]]); // This one sub is ['a' => 3] 

部分的にサブアレイを交換するにはどうすればいいですか?デフォルトの設定を置き換えるために

+1

何をあなたは 'を意味するのですが、それはsubarray'では動作しないのだろうか?あなたのコードは 'b 'を削除して' sub = [' a '=> 3' 'を返します。あなたは' b'を保持しますか? –

答えて

1

使用array_replace_recursive機能:

function doSomething($config = []) { 
    $default = [ 
     'name' => 'Chan', 
     'age' => 36, 
     'sub' => [ 'a' => 1, 'b' => 2 ] 
    ]; 

    if (!empty($config)) { 
     $default = array_replace_recursive($default, $config); 
    } 
    print_r($default); 
} 

//doSomething(); // This one sub is ['a' => 1, 'b' => 2] 
doSomething(['sub' => ['a' => 3]]); 

出力:

Array 
(
    [name] => Chan 
    [age] => 36 
    [sub] => Array 
     (
      [a] => 3 
      [b] => 2 
     ) 
) 
0

再帰:

<?php 
function updater($old, $new) { 
    if (is_array(current($old)) && is_array(current($new))) { 
     return updater($old, $new); 
    } else { 
     return array_merge($old, $new); 
    } 
} 

function doSomething($config = null) { 
    $default = [ 
     'name' => 'Chan', 
     'age' => 36, 
     'sub' => [ 
      'a' => 1, 
      'b' => 2 
     ] 
    ]; 

    if ($config !== null) { 
     foreach($config as $key => $value) { 
      $default[$key] = updater($default[$key], $value); 
     } 
    } 

    print_r($default); 
} 

doSomething(); 
doSomething(['sub' => ['a' => 3]]); 

結果:我々は変更する必要があるデータとして

Array 
(
    [name] => Chan 
    [age] => 36 
    [sub] => Array 
     (
      [a] => 1 
      [b] => 2 
     ) 

) 
Array 
(
    [name] => Chan 
    [age] => 36 
    [sub] => Array 
     (
      [a] => 3 
      [b] => 2 
     ) 

) 
0
<?php 
$default_data = [ 
     "name" => "Meraj", 
     "age" => 21, 
     "education" => [ 
      "school" => "JMI", 
      "college" => "GGSIPU" 
     ] 
    ]; 
    function modifyArrayData($default_data, $new_data = null) 
    { 
     foreach ($new_data as $key => $value) { 
      if (!is_array($value)) { 
       $default_data[$key] = $value; 
      } else { 
       $default_data[$key] =modifyArrayData($default_data[$key], $value); 
      } 
     } 
     return $default_data; 
    } 

    $new_data = ["name" => "Coder", "education" => ["school" => "Jamia"]]; 
    $test = modifyArrayData($default_data, $new_data); 
    var_dump($test); 

が未知の深さの多次元配列にすることができますので、我々は再帰を使用する必要がありますそれぞれハンドルします。

関連する問題