PHP:如何使用另一个数组中的值覆盖一个数组中的值而不向数组添加新键?

时间:2010-05-14 22:37:54

标签: php arrays

我有一个包含默认设置的数组,以及一个包含用户指定设置的数组。我想合并这两个数组,以便用用户指定的数组覆盖默认设置。

我尝试使用array_merge,它会像我想要的那样进行覆盖,但如果用户指定了默认设置中不存在的设置,它还会添加新设置。我可以使用比array_merge更好的功能吗?或者是否有一个函数可用于过滤用户指定的数组,以便它只包含默认设置数组中也存在的键?

我想要的例子

$default = array('a' => 1, 'b' => 2);
$user = array('b' => 3, 'c' => 4);

// Somehow merge $user into $default so we end up with this:
Array
(
    [a] => 1
    [b] => 3
)

4 个答案:

答案 0 :(得分:21)

您实际上只需将两个数组添加到一起($user+$default),而不是使用array_merge

如果要停止默认设置中不存在的任何用户设置,可以使用array_intersect_key

  

返回一个关联数组,其中包含array1的所有条目,这些条目具有所有参数中都存在的键

实施例

$default = array('a' => 1, 'b' => 2);
$user = array('b' => 3, 'c' => 4);

// add any settings from $default to $user, then select only the keys in both arrays
$settings = array_intersect_key($user + $default, $default);

print_r($settings);

结果:

Array
(
    [b] => 3
    [a] => 1
)

首先从$user中选择键/值(和顺序),这就是b在数组a之前出现的原因,没有a$user中。 $user中未定义<{1}}中 中定义的任何键都将添加到$default的末尾。然后,您移除$user中未在$user + $default中定义的任何键。

答案 1 :(得分:1)

如果你只想考虑那些,那么在default-settings数组中循环键可能是最简单的。所以你可以这样做:

foreach ($default_settings AS $key => $default_value)
{
    if (array_key_exists($key, $user_settings))
    {
        $combined_settings[$key] = $user_settings[$key];
    }
    else
    {
        $combined_settings[$key] = $default_value;
    }
}

答案 2 :(得分:1)

foreach($default as $key=>$val){   
  if (isset($user[$key]))
  {
    $settings[$key] = $user[$key];
  } else {
    $settings[$key] = $default[$key];
  } 
}

我认为这就是你想要的。

答案 3 :(得分:0)

foreach($user_settings as $key=>$val){   
    $global_settings[$key] = $val; 
}