Uffo
Uffo

Reputation: 10056

Array merge with same key's dont' overwrite

So I have the following 2 arrays, with keys 2016 and 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"
  }
}

Now, after array merge I should get an array with 2 keys of data, 2016 and 2017 but instead I get an array with 3 keys, it's not overwriting the array with the same key.

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

Why is this happening? Is it normal?

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

Upvotes: 2

Views: 4152

Answers (2)

mickmackusa
mickmackusa

Reputation: 48041

array_replace() will overwrite your first 2017 subarray with your second:

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


+ operator, then ksort() will do the same:

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


A demo link where you can play with functions on the two array variables.

array_merge() and array_merge_recursive() will result in 3 subarrays.


Even if you convert the keys to strings like '2017', array_merge() will still treat them like numbers, and you'll get 3 subarrays.

If you go as far as prefix each key with #, then you are able to use array_merge() as intended. Try with #[year] on all keys and you will have 2 merged subarrays. (you can test for yourself in the above demo link)

Upvotes: 2

buildok
buildok

Reputation: 785

Values in the input array with numeric keys will be renumbered with incrementing keys starting from zero in the result array.

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

Upvotes: 4

Related Questions