8

我想将两个数组相互合并:

$filtered = array(1 => 'a', 3 => 'c');
$changed = array(2 => 'b*', 3 => 'c*');

鉴于合并应包括 的所有元素,$filtered并且所有这些元素在$changed中具有相应的键$filtered

$merged = array(1 => 'a', 3 => 'c*');

array_merge($filtered, $changed)$changed也会添加into的附加键$filtered。所以它真的不适合。

我知道我可以$keys = array_intersect_key($filtered, $changed)用来获取两个数组中存在的键,这已经是工作的一半。

但是我想知道是否有任何(本机)函数可以将数组减少为由指定$changed的数组?我知道我可以使用回调函数并在其中进行检查,但是可能还有其他一些纯本机函数可以仅从可以指定键的数组中提取那些元素?$keysarray_intersect_keyarray_filter$keys

我问是因为本机函数通常比array_filter回调快得多。

4

3 回答 3

19

如果我正确理解您的逻辑,这应该可以做到:

array_intersect_key($changed, $filtered) + $filtered

执行:

$filtered = array(1 => 'a', 3 => 'c');
$changed = array(2 => 'b*', 3 => 'c*');
$expected = array(1 => 'a', 3 => 'c*');    
$actual = array_key_merge_deceze($filtered, $changed);

var_dump($expected, $actual);

function array_key_merge_deceze($filtered, $changed) {
    $merged = array_intersect_key($changed, $filtered) + $filtered;
    ksort($merged);
    return $merged;
}

输出:

Expected:
array(2) {
  [1]=>
  string(1) "a"
  [3]=>
  string(2) "c*"
}

Actual:
array(2) {
  [1]=>
  string(1) "a"
  [3]=>
  string(2) "c*"
}
于 2011-07-03T10:18:39.273 回答
0

如果您希望第二个数组 ($b) 成为指示如果那里只有键的模式,那么您也可以试试这个

$new_array =  array_intersect_key( $filtered, $changed ) + $changed;
于 2016-11-22T03:21:42.193 回答
0

如果您的键是非数字的(您的不是,所以这不是您确切问题的解决方案),那么您可以使用这种技术:

$filtered = array('a' => 'a', 'c' => 'c');
$changed = array('b' => 'b*', 'c' => 'c*');

$merged = array_slice(array_merge($filtered, $changed), 0, count($filtered));

结果:

Array
(
    [a] => a
    [c] => c*
)

这是有效的,因为对于非数字键,array_merge覆盖现有键的值,并将键附加$changed到新数组的末尾。所以我们可以简单地丢弃合并数组末尾的任何键,而不是原始数组的计数。

由于这适用于相同的问题,但具有不同的密钥类型,我想我会提供它。

如果您将它与数字键一起使用,那么结果只是$filtered带有重新索引键的原始数组(在这种情况下)(IE 就像您使用过的一样array_values)。

于 2020-12-02T21:26:25.480 回答