17

我试图用另一个数组的值覆盖一个数组的元素——而不在这个过程中创建额外的元素。

例如:

$base = array('a' => 'apple', 'b' => 'banana');
$replace = array('a' => 'orange', 'b' => 'grape', 'c' => 'cauliflower');

合并数组以创建:

array('a' => 'orange', 'b' => 'grape'); // 'c' not included

使用array_mergearray_replace将正确覆盖元素,但生成的数组将包含第一个数组中未找到的元素。

如何组合两个数组以创建一个仅包含第一个数组中的键和第二个数组中的相应值的数组?

是否有现有的 PHP 数组函数可以做到这一点?

谢谢你的帮助!

4

5 回答 5

21

您可以使用array_intersect_keyarray_merge执行此操作:

$result = array_merge($base, array_intersect_key($replace, $base));

array_intersect_key$replace用已经存在的键隔离那些元素$base(确保新元素不会出现在结果中)并用这些新值array_merge替换其中的值(同时确保仅出现在的键将保留其原始值)。$base$replace$base

看到它在行动

有趣的是,颠倒调用顺序也可以达到相同的结果:

$result = array_intersect_key(array_merge($base, $replace), $base);

不过这个版本做的工作稍微多一些,所以我推荐第一个。

于 2013-08-14T19:31:06.570 回答
3
print_r(array_intersect_key($replace, $base));
于 2013-08-14T19:31:11.580 回答
0

我想不出为此的内置方法,但是,使用循环和array_key_exists.

foreach( $replace as $k => $v )
{
   if ( array_key_exists( $k, $base ) )
      $base[ $k ] = $v;
}
于 2013-08-14T19:27:40.187 回答
0

以下应该做到这一点:

foreach ($replace as $k => $v)
   if (isset($base[$k])) $base[$k]=$v;
于 2013-08-14T19:30:53.040 回答
0

尝试这个:

$result = array_replace($base, array_intersect_key($replace, $base));
于 2017-06-30T22:07:32.040 回答