我想将两个数组相互合并:
$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
的其他键添加到$filtered
中。所以它并不适合。
我知道我可以使用$keys = array_intersect_key($filtered, $changed)
来获取两个数组中已经存在的一半工作的密钥。
但是我想知道是否有任何(本机)函数可以将$changed
数组缩减为$keys
指定array_intersect_key
的数组?我知道我可以使用带有回调函数的array_filter
并检查其中的$keys
,但是可能还有一些其他纯粹的本机函数只能从可以指定键的数组中提取那些元素? / p>
我问,因为本机函数通常比带有回调的array_filter
快得多。
答案 0 :(得分:17)
如果我正确理解你的逻辑,那应该这样做:
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*"
}
答案 1 :(得分:0)
如果你想让第二个数组($ b)成为一个模式,表明如果那里只有密钥,你也可以试试这个
$new_array = array_intersect_key( $filtered, $changed ) + $changed;
答案 2 :(得分: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
一样)。