具有相同键的数组合并不会被覆盖
Array merge with same key's dont' overwrite
所以我有以下 2 个数组,键为 2016
和 2017
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 个数据键的数组,2016
和 2017
但我得到的是一个包含 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"
}
}
为什么会这样?正常吗?
Info: PHP 5.6.30 (cli) (built: Feb 7 2017 16:18:37) Copyright (c)
1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016
Zend Technologies
Values in the input array with numeric keys will be renumbered with incrementing keys starting from zero in the result array.
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 个合并的子数组。 (大家可以在上面的demo中自己测试link)
所以我有以下 2 个数组,键为 2016
和 2017
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 个数据键的数组,2016
和 2017
但我得到的是一个包含 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"
}
}
为什么会这样?正常吗?
Info: PHP 5.6.30 (cli) (built: Feb 7 2017 16:18:37) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
Values in the input array with numeric keys will be renumbered with incrementing keys starting from zero in the result array.
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 个合并的子数组。 (大家可以在上面的demo中自己测试link)