Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过只接收与第一个数组具有相同键的第二个数组中的值来合并两个数组?_Php_Arrays_Filter_Array Merge_Array Key - Fatal编程技术网

Php 如何通过只接收与第一个数组具有相同键的第二个数组中的值来合并两个数组?

Php 如何通过只接收与第一个数组具有相同键的第二个数组中的值来合并两个数组?,php,arrays,filter,array-merge,array-key,Php,Arrays,Filter,Array Merge,Array Key,我想将两个数组相互合并: $filtered = array(1 => 'a', 3 => 'c'); $changed = array(2 => 'b*', 3 => 'c*'); 而合并应包括$filtered的所有元素以及$changed中具有相应键的所有$filtered元素: $merged = array(1 => 'a', 3 => 'c*'); array\u merge($filtered,$changed)也会将$changed的附加键

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

$filtered = array(1 => 'a', 3 => 'c');
$changed = array(2 => 'b*', 3 => 'c*');
而合并应包括
$filtered
的所有元素以及
$changed
中具有相应键的所有
$filtered
元素:

$merged = array(1 => 'a', 3 => 'c*');
array\u merge($filtered,$changed)
也会将
$changed
的附加键添加到
$filtered
中。所以它不太合适

我知道我可以使用
$keys=array\u intersect\u key($filtered,$changed)
获取两个数组中存在的键,这已经是工作的一半

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


我这样问是因为本机函数通常比回调的
array\u filter
快得多。

如果我正确理解了您的逻辑,应该这样做:

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*"
}

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

$new_array =  array_intersect_key( $filtered, $changed ) + $changed;

如果您的密钥是非数字的(您的密钥不是,因此这不是您确切问题的解决方案),那么您可以使用以下技术:

$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\u merge
会覆盖现有键的值,并将
$changed
中的键追加到新数组的末尾。因此,我们可以简单地从合并数组的末尾丢弃超过原始数组计数的任何键

因为这适用于同一个问题,但有不同的关键类型,我想我会提供它


如果将其与数字键一起使用,则结果仅为原始数组(
$filtered
,在本例中)与重新索引的键(即,就好像使用了
数组\u值
)。

对交叉点进行并集。但union将添加
$filtered
以及AFAIK的键。我试试看。我只是测试了一下,我的错;)。它工作得很好,只是键的顺序发生了变化,但这没有问题,因为我把它们作为一个数字索引,所以ksort完成了这项工作。完美的非常感谢@deceze
array\u intersect\u key($changed,$filtered)+$filtered
Strange。我以前从没见过。不知道这里发生了什么,但它起作用了!
+$filtered
@数组相交键($changed,$filtered)从
$changed
中获取所有值,这些值在
$filtered
中有一个键,即它生成一个子集
$filtered
+$filtered
然后将
$filtered
中的其余值添加回结果中,即它将填充备份子集,以使
$filtered
中的所有键都处于状态。根据您的使用情况,当
$filtered
为空时,您可能需要放置一个返回值
$changed