Let's say I have following arrays:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
)
[1] => Array
(
[id] => 4
[name] => Computers
)
[3] => Array
(
[id] => 7
[name] => Science
[4] => Array
(
[id] => 1
[name] => Sports
)
)
And the second one:
Array
(
[0] => Array
(
[id] => 1
[title] => Sport
)
[1] => Array
(
[id] => 7
[title] => Sci
)
[3] => Array
(
[id] => 4
[title] => Comp
[4] => Array
(
[id] => 5
[title] => Edu
)
)
And desired output is:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
I have managed to merge these arrays with simply:
foreach($first as $key => $value){
$result[$key] = array_merge($first[$key], $second[$key]);
}
But the output is not combined correctly:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Sport
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Sci
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Comp
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Edu
)
)
The problem is I would like to merge these arrays on the same id
.
Desired output sorting should be same as in the first array.
How can I achieve this? Any help is much appreciated.
To provide an alternative approach available in
PHP 5.5+
.Since the ordering of the two arrays is not identical, first use array_column to index the arrays by the
id
.This will allow you to use array_replace_recusrive on the
id
indexed arrays.array_replace_recursive
will merge the values in the arrays matching the index association of both array sets.Optionally use
array_values
to reindex the array, removing theid
index association.Example https://3v4l.org/ndv2j
Result
Make sure that the items are in the same order then:
You code works fine. Your expectations are simply incorrect. For example in one array 4th element
id
holds 1 but in another array, 4th elementid
is 5, so your "merge these arrays on the same id" makes no sense as by merging 4th elements into one you also merge their children, and sinceid
is used in both arrays, once value HAVE TO be gone as there cannot be two equal keys in array.EDIT
you have to merge manually as PHP functions merge based on keys while you want to merge based on content:
As long as both arrays always have every id in them, what about sorting the two arrays by that 'id' field, then letting php do the merge?
Have not tested the code, but it demonstrates the idea.
You can just do a nested loop and check if the
id
values match, then addtitle
to$first
(orname
to$second
)Do not use foreach in foreach,that might be too slow when the array so big.