【问题标题】:Array merge with same key's dont' overwrite具有相同键的数组合并不会覆盖
【发布时间】:2017-12-31 08:07:58
【问题描述】:

所以我有以下 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 技术

【问题讨论】:

  • 阅读手册:“但是,如果数组中包含数字键,后面的值不会覆盖原来的值,而是会被追加。” php.net/manual/en/function.array-merge.php
  • 你期望的结果数组是什么?哪个数组是$results,哪个是$results_from_db

标签: php arrays zend-framework


【解决方案1】:

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

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

【讨论】:

  • 谢谢!您知道可以适用于我的情况的解决方案吗?
  • 我认为array_replace在这种情况下会是一个更好的解决方案,谢谢你帮助我理解
【解决方案2】:

array_replace() 将用您的第二个子数组覆盖您的第一个 2017 子数组:

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


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

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


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

array_merge()array_merge_recursive() 将产生 3 个子数组。


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

如果您在每个键前面加上#,那么您就可以按预期使用array_merge()。尝试在所有键上使用#[year],您将拥有 2 个合并的子数组。 (您可以在上面的演示链接中自己测试)

【讨论】:

  • 这应该是最好的答案,因为它不仅更好地解释了如何处理提议的问题的概念,而且在包含沙盒测试环境的同时也为上下文带来了有价值的知识。 +1
猜你喜欢
  • 2021-06-05
  • 2011-08-18
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多