php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #27162 Bad int keys generated by array_merge_recursive
Submitted: 2004-02-05 14:49 UTC Modified: 2004-02-07 22:52 UTC
From: tomas dot matousek at matfyz dot cz Assigned:
Status: Not a bug Package: Arrays related
PHP Version: 4CVS, 5CVS OS: WinXP
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: tomas dot matousek at matfyz dot cz
New email:
PHP Version: OS:

 

 [2004-02-05 14:49 UTC] tomas dot matousek at matfyz dot cz
Description:
------------
Function array_merge_recursive merges arrays recursivelly but the behavior of merging is different in the first level from the next ones.

Merging of arrays in the second and next levels starts key indexing from the key of the first item merged but on the first level it starts always from zero.

Maybe it is a feature but IMHO it would be better to implement the same behavior on each level of a recursion.


Reproduce code:
---------------
    $ar1 = array(4=>4, 5=>5);
    $ar2 = array(4=>4, 5=>5);

    print_r(array_merge_recursive($ar1, $ar2)); 

    $ar1 = array("a" => array(4=>4, 5=>5));
    $ar2 = array("a" => array(4=>4, 5=>5));

    print_r(array_merge_recursive($ar1, $ar2)); 

    $ar1 = array("a" => array("a" => array(4=>4, 5=>5)));
    $ar2 = array("a" => array("a" => array(4=>4, 5=>5)));

    print_r(array_merge_recursive($ar1, $ar2)); 


Expected result:
----------------
Array
(
    [0] => 4
    [1] => 5
    [2] => 4
    [3] => 5
)
Array
(
    [a] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 4
            [3] => 5
        )

)
Array
(
    [a] => Array
        (
            [a] => Array
                (
                    [0] => 4
                    [1] => 5
                    [2] => 4
                    [3] => 5
                )

        )

)



Actual result:
--------------
Array
(
    [0] => 4
    [1] => 5
    [2] => 4
    [3] => 5
)
Array
(
    [a] => Array
        (
            [4] => 4
            [5] => 5
            [6] => 4
            [7] => 5
        )

)
Array
(
    [a] => Array
        (
            [a] => Array
                (
                    [4] => 4
                    [5] => 5
                    [6] => 4
                    [7] => 5
                )

        )

)



Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-02-05 21:48 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

This is to be expected. Indexing of any array always starts 
from element 0 and is not carried over across array 
dimensions. 
 [2004-02-06 03:41 UTC] tomas dot matousek at matfyz dot cz
Maybe the example I used was not understood well.
I don't want indexing to be propagated thru array dimensions. IMHO array_merge_recursive is indexing in two different ways depending of the level of recursion. This is better example:

Reproduce code:
---------------

    $ar1 = array(10=>10, 7=>7);
    $ar2 = array(10=>10, 7=>7);

    print_r(array_merge_recursive($ar1, $ar2)); 

    $ar1 = array("a" => array(10=>10, 7=>7));
    $ar2 = array("a" => array(10=>10, 7=>7));

    print_r(array_merge_recursive($ar1, $ar2)); 

    $ar1 = array("a" => array("a" => array(10=>10, 7=>7)));
    $ar2 = array("a" => array("a" => array(10=>10, 7=>7)));

    print_r(array_merge_recursive($ar1, $ar2)); 


Actual result:
--------------

Array
(
    [0] => 10
    [1] => 7
    [2] => 10
    [3] => 7
)
Array
(
    [a] => Array
        (
            [10] => 10
            [7] => 7
            [11] => 10
            [12] => 7
        )

)
Array
(
    [a] => Array
        (
            [a] => Array
                (
                    [10] => 10
                    [7] => 7
                    [11] => 10
                    [12] => 7
                )

        )

)

Expected result is the same as above.
 [2004-02-06 10:46 UTC] sniper@php.net
From the manual:

"If the input arrays have the same string keys, then the values for these keys are merged together into an array, and this is done recursively, so that if one of the values is an array itself, the function will merge it with a corresponding entry in another array too. If, however, the arrays have the same numeric key, the later value will not overwrite the original value, but will be appended."
 [2004-02-06 14:11 UTC] tomas dot matousek at matfyz dot cz
"If the input arrays have the same string keys, then the values for these keys are merged together into an array ..."
Of course that the values are merged. But the way in which are merged is IMHO wrong. Keys are reindexed starting from 0 in the first level of recursion but in the next levels reindexing is different. As one can see on the output of an example above. Why?
 [2004-02-07 22:52 UTC] sniper@php.net
There is no bug in this.

 [2016-01-08 21:06 UTC] fwwarr at gmail dot com
I have also come across this and believe it to be a bug. As per the documentation, array_merge is supposed to re-index numeric keys from 0. One would expect array_merge_recursive to re-index numeric keys from 0 at every level of recursion, however, it only re-indexes numeric keys at the first level. A recursive function that behaves differently at different levels of recursion is objectively a bug.

Maybe a simpler example will illustrate it better:

Reproduce code:
---------------
$ar1 = array(1 => array(2 => 3));
print_r(array_merge_recursive($ar1));

Expected result:
----------------
Array
(
    [0] => Array
        (
            [0] => 3
        )

)

Actual result:
----------------
Array
(
    [0] => Array
        (
            [2] => 3
        )

)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Oct 31 22:01:27 2024 UTC