Php array_merge与数字键上的array_intersect_key一起无法正常工作

时间:2017-07-27 18:28:37

标签: php arrays

我有一个奇怪的场景,Array_merge正在使用非编号键,但即使我尝试使用“Add”而不是Array_merge,它也无法使用数字键。

编码

$array_1['key1']="";
$array_1['key2']="";
$array_1['key3']="";
$array_1['key4']="";
$array_1['key5']="";
$array_1['key6']="";
$array_1['key7']="";

$array_2['key1']="value1";
$array_2['key3']="value2";
$array_2['key4']="value3";
$array_2['key8']="value4";

$array_3[1]="";
$array_3[2]="";
$array_3[3]="";
$array_3[4]="";
$array_3[5]="";
$array_3[6]="";
$array_3[7]=""; 

$array_4[1]="1";
$array_4[3]="2";
$array_4[4]="3";
$array_4[8]="4";

$results= array_merge($array_1, array_intersect_key($array_2, $array_1));
echo '<pre>',print_r($results),'</pre>';

$results2= array_merge($array_3, array_intersect_key($array_4, $array_3));
echo '<pre>',print_r($results2),'</pre>';

enter image description here

我认为使用+运算符会起作用,但不是。

$results2= $array_3+array_intersect_key($array_4, $array_3);

而不是

$results2= array_merge($array_3, array_intersect_key($array_4, $array_3));

输出是左侧是错误的; $ array_4中的所有值都消失了!我希望结果是正确的。

enter image description here

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:2)

array_merge()正如documentation

中所述
  

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键。但是,如果数组包含数字键,则后面的值覆盖原始值,但会被追加。

有两种方法可以组合两个数组。

array_merge()

array_merge()对字符串和数字键的工作方式不同。

返回的数组包含两个数组中的所有字符串键。对于公用密钥,将返回第二个数组中的值。

在结果数组中返回与数字键关联的所有值。来自第一个数组的那些首先是来自第二个数组的那些。数字键不会保留,它们在返回的数组中从零开始。

示例:

$array1 = array(
    'one' => 1,
    2 => 2,
    'three' => 3,
    4 => 4,
);

$array2 = array(
    'three' => 'three',
    4 => 'four',
    5 => 'five',
    'six' => 'six'
);

print_r(array_merge($array1, $array2));

输出结果为:

Array
(
    [one] => 1
    [0] => 2
    [three] => three
    [1] => 4
    [2] => four
    [3] => five
    [six] => six
)

$array1 + $array2

union operator
生成一个数组,其中包含第一个数组的所有键和值以及第一个数组中不存在的第二个数组的键(具有相应的值)。它以相同的方式处理字符串和数字键,并且它不会重新索引。

当两个数组中都存在键时,将使用第一个数组中的值。忽略第二个数组中的那个。

print_r($array1 + $array2)的输出:

Array
(
    [one] => 1
    [2] => 2
    [three] => 3
    [4] => 4
    [5] => five
    [six] => six
)

array_replace()

array_replace()也以相同的方式处理字符串和数字键。它返回的数组包含两个数组中的所有键。对于公用密钥,将返回第二个数组中的值。

print_r(array_replace($array1, $array2))的输出是:

Array
(
    [one] => 1
    [2] => 2
    [three] => three
    [4] => four
    [5] => five
    [six] => six
)

除了键和值的顺序之外,array_replace($array1, $array2)返回与$array2 + $array1相同的数组。

结论

如果要合并两个数组,如果$array1 + $array2的值更重要,请使用$array1;如果array_replace($array1, $array2)的值更重要,请使用$array2。在这两种情况下,$array1的键在结果数组中排在第一位,然后在$array2中不存在$array1的键。

当它合并的数组具有相同类型的键(全部数字或所有字符串)时,

array_merge()正常工作。如果键是字符串,array_merge($array1, $array2)会产生与array_replace($array1, $array2)相同的结果。

如果所有键都是数字键,array_merge($array1, $array2)会生成一个数组,其中包含$array1的所有值,后跟$array2的所有值(每个值的顺序与原始值相同数组)。新数组中的键是数字的,连续的,从零开始。

对于数字键,array_merge($array1, $array2)产生的结果与:

相同
$result = array();
foreach ($array1 as $value) {
    $result[] = $value;
}
foreach ($array2 as $value) {
    $result[] = $value;
}

所有这三种方法都可以用来组合两个以上的数组。当它们组合两个以上的数组时,它们产生的结果与它们组合前两个数组时产生的结果相同,然后结果与第三个数组相同,依此类推,从左到右。

答案 1 :(得分:1)

  

尝试将第二个 array_merge替换为array_replace

$results2= array_replace($array_3, array_intersect_key($array_4, $array_3));