2016-03-18 20 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); 

它涵盖了我的使用情况。