数组合并同一个键不要'覆盖

时间:2017-07-25 11:58:33

标签: php arrays zend-framework

所以我有以下2个数组,其中包含键20162017

array(2) {
  [2016]=>
  array(11) {
    ["id"]=>
    string(1) "0"
    [0]=>
    string(1) "0"
    ["user_id"]=>
    string(1) "0"
    ["entry_id"]=>
    int(0)
    ["user_name"]=>
    string(0) ""
    [3]=>
    string(0) ""
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(0) ""
    ["created"]=>
    string(4) "2016"
    ["total"]=>
    int(0)
  }
  [2017]=>
  array(11) {
    ["id"]=>
    string(1) "0"
    [0]=>
    string(1) "0"
    ["user_id"]=>
    string(1) "0"
    ["entry_id"]=>
    int(0)
    ["user_name"]=>
    string(0) ""
    [3]=>
    string(0) ""
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(0) ""
    ["created"]=>
    string(4) "2017"
    ["total"]=>
    int(0)
  }
}
array(1) {
  [2017]=>
  array(30) {
    ["id"]=>
    string(2) "52"
    [0]=>
    string(2) "52"
    ["user_id"]=>
    NULL
    [1]=>
    NULL
    ["entry_id"]=>
    string(1) "2"
    [2]=>
    string(1) "2"
    ["user_name"]=>
    NULL
    [3]=>
    NULL
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(4) "null"
    [5]=>
    string(4) "null"
    ["entry_type"]=>
    string(6) "banner"
    [6]=>
    string(6) "banner"
    ["created"]=>
    string(19) "2017-06-21 10:25:49"
    [7]=>
    string(19) "2017-06-21 10:25:49"
    ["ip"]=>
    string(9) "127.0.0.1"
    [8]=>
    string(9) "127.0.0.1"
    ["user_agent"]=>
    string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    [9]=>
    string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    ["browser"]=>
    string(13) "Google Chrome"
    [10]=>
    string(13) "Google Chrome"
    ["browser_version"]=>
    string(2) "58"
    [11]=>
    string(2) "58"
    ["os"]=>
    string(28) "Mac OSX 10 (Unknown Version)"
    [12]=>
    string(28) "Mac OSX 10 (Unknown Version)"
    ["total"]=>
    string(3) "510"
    [13]=>
    string(3) "510"
    ["date_only"]=>
    string(4) "2017"
    [14]=>
    string(4) "2017"
  }
}

现在,在数组合并之后,我应该得到一个包含2个数据键20162017的数组,但是我得到一个包含3个键的数组,它不会用相同的键覆盖数组。

$final = array_merge($results,$results_from_db);

array(3) {
  [0]=>
  array(11) {
    ["id"]=>
    string(1) "0"
    [0]=>
    string(1) "0"
    ["user_id"]=>
    string(1) "0"
    ["entry_id"]=>
    int(0)
    ["user_name"]=>
    string(0) ""
    [3]=>
    string(0) ""
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(0) ""
    ["created"]=>
    string(4) "2016"
    ["total"]=>
    int(0)
  }
  [1]=>
  array(11) {
    ["id"]=>
    string(1) "0"
    [0]=>
    string(1) "0"
    ["user_id"]=>
    string(1) "0"
    ["entry_id"]=>
    int(0)
    ["user_name"]=>
    string(0) ""
    [3]=>
    string(0) ""
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(0) ""
    ["created"]=>
    string(4) "2017"
    ["total"]=>
    int(0)
  }
  [2]=>
  array(30) {
    ["id"]=>
    string(2) "52"
    [0]=>
    string(2) "52"
    ["user_id"]=>
    NULL
    [1]=>
    NULL
    ["entry_id"]=>
    string(1) "2"
    [2]=>
    string(1) "2"
    ["user_name"]=>
    NULL
    [3]=>
    NULL
    ["action"]=>
    string(11) "banner view"
    [4]=>
    string(11) "banner view"
    ["entry_details"]=>
    string(4) "null"
    [5]=>
    string(4) "null"
    ["entry_type"]=>
    string(6) "banner"
    [6]=>
    string(6) "banner"
    ["created"]=>
    string(19) "2017-06-21 10:25:49"
    [7]=>
    string(19) "2017-06-21 10:25:49"
    ["ip"]=>
    string(9) "127.0.0.1"
    [8]=>
    string(9) "127.0.0.1"
    ["user_agent"]=>
    string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    [9]=>
    string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    ["browser"]=>
    string(13) "Google Chrome"
    [10]=>
    string(13) "Google Chrome"
    ["browser_version"]=>
    string(2) "58"
    [11]=>
    string(2) "58"
    ["os"]=>
    string(28) "Mac OSX 10 (Unknown Version)"
    [12]=>
    string(28) "Mac OSX 10 (Unknown Version)"
    ["total"]=>
    string(3) "510"
    [13]=>
    string(3) "510"
    ["date_only"]=>
    string(4) "2017"
    [14]=>
    string(4) "2017"
  }
}

为什么会这样?这是正常的吗?

  

信息:PHP 5.6.30(cli)(建于2017年2月7日16:18:37)版权所有(c)   1997-2016 PHP Group Zend Engine v2.6.0,版权所有(c)1998-2016   Zend Technologies

2 个答案:

答案 0 :(得分:2)

  

带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。

http://php.net/manual/en/function.array-merge.php

答案 1 :(得分:0)

array_replace()将覆盖您的第一个2017年子阵列:

var_export(array_replace($a,$b));

+运算符,然后ksort()将执行相同操作:

$overwrite=$b+$a;
ksort($overwrite);
var_export($overwrite);

A demo link,您可以在其中使用两个数组变量上的函数。

array_merge()array_merge_recursive()将产生3个子阵列。

即使您将密钥转换为'2017'之类的字符串,array_merge()仍然会将它们视为数字,并且您将获得3个子数组。

如果您使用#为每个密钥添加前缀,则可以按预期使用array_merge()。在所有键上尝试#[year],您将有2个合并的子阵列。 (您可以在上面的演示链接中测试自己)