2017-02-16 1 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 

일부 구성 매개 변수를 함수에 전달하면 array_merge를 부분적으로 업데이트 할 수 있지만 하위 배열에서는 작동하지 않습니다.부분 배열을 부분적으로 바꾸는 방법

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); 

및 각각 핸들.

관련 문제