2016-03-18 21 views
0

我有兩個數組:結合兩個數組只匹配覆蓋

原:

array(2) { 
    'app_name' => 
    string(15) "dropcat-default" 
    'site' => 
    array(1) { 
    'environment' => 
    array(7) { 
     'drush_alias' => 
     NULL 
     'backup_path' => 
     string(6) "backup" 
     'config_name' => 
     NULL 
     'original_path' => 
     string(33) "/var/www/webroot/shared/some_path" 
     'symlink' => 
     string(43) "/var/www/webroot/mysite_latest/symlink_path" 
     'url' => 
     string(17) "http://localhost" 
     'name' => 
     string(11) "mystagesite" 
    } 
    } 
} 

,是其中一種替代:

array(2) { 
    'app_name' => 
    string(17) "dropcat-overrides" 
    'site' => 
    array(1) { 
    'environment' => 
    array(1) { 
     'drush_alias' => 
     string(6) "foobar" 
    } 
    } 
} 

我想要替換的覆蓋原始數組,但保留在覆蓋中不存在的鍵 - 使用array_replace只是寫入現有數字,因爲我在數組中有數組。有沒有簡單的方法來解決這個問題?

回答

0
function _merge_array_rec($arr, $arr2, $i = 0) 
{ 
    foreach ($arr2 as $key => $value) 
    { 
     if (!isset($arr[$key])) 
     { 
      $arr[$key] = $value; 
     } 
     else 
     { 
      if (is_array($value)) 
      { 
       $arr[$key] = _merge_array_rec($arr[$key], $arr2[$key], $i + 1); 
      } 
      else 
      { 
       $arr[$key] = $value; 
      } 
     } 
    }   
    return $arr; 
} 

$merge_array = _merge_array_rec($array1, $array2); 
+0

謝謝,我也剛剛發現有一個函數調用'array_replace_recursive' - 這也是我所追求的。 –

+0

@MikkeSchirén確實!您可以自己回答並投票給您最佳答案;) – Aleeeeee

+0

在array_replace_recursive函數中,值不會被第二個數組替換。所以我必須創建覆蓋第一個數組值的函數 –

0

array_replace_recursive爲多維數組做準備。

對於單維數組,循環訪問原始數組,然後檢查重寫數組是否具有此值足夠有趣。

事情與此類似:

$original=array(); 
$overriding=array(); 
foreach($original as $key => $value){ 
    if(isset($overriding[$key]) && !empty($overriding[$key])){ 
     $original[$key]=$overriding[$key]; 
    } 
} 

希望這有助於

0
  • array_key_exists應該用來代替isset,因爲isset忽略NULL
  • $overrides的結構應該驗證,不應該嗎?

試一試。

<?php 

function array_replace_recursive_if_valid(array $defaults, array $overrides) { 
    foreach ($overrides as $key => $value) { 
     if (!array_key_exists($key, $defaults)) { 
      continue; 
     } 
     if (is_array($defaults[$key]) && is_array($value)) { 
      $defaults[$key] = array_replace_recursive_if_valid($defaults[$key], $value); 
      continue; 
     } 
     if (!is_array($defaults[$key]) && !is_array($value)) { 
      $defaults[$key] = $value; 
      continue; 
     } 
    } 
    return $defaults; 
} 

$defaults = [ 
    'app_name' => 'dropcat-default', 
    'site' => [ 
     'environment' => [ 
      'drush_alias' => null, 
      'back_path' => 'packup', 
      'config_name' => null, 
      'original_path' => '/var/www/webroot/shared/some_path', 
      'symlink' => '/var/www/webroot/mysite_latest/symlink_path', 
      'url' => 'http://localhost', 
      'name' => 'mystagesite', 
     ], 
    ], 
]; 

$overrides = [ 
    'app_name' => 'dropcat-overrides', 
    'this is invalid' => 'foo', 
    'site' => [ 
     'environment' => [ 
      'drush_alias' => 'foobar', 
      'url' => ['this is invalid'], 
     ], 
    ], 
]; 

var_export(array_replace_recursive_if_valid($defaults, $overrides)); 
0

最後,我結束了做這樣的:

$configs = array_replace_recursive($default_config, $env_config); 

它涵蓋了我的使用情況。