Merging two multidimensional arrays on specific key
You can just do a nested loop and check if the id
values match, then add title
to $first
(or name
to $second
)
foreach($first as $key => $value){
foreach($second as $value2){
if($value['id'] === $value2['id']){
$first[$key]['title'] = $value2['title'];
}
}
}
You code works fine. Your expectations are simply incorrect. For example in one array 4th element id
holds 1 but in another array, 4th element id
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 since id
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:
$result = array();
foreach( $arrayA as $keyA => $valA ) {
foreach( $arrayB as $keyB => $valB ) {
if( $valA['id'] == $valB['id'] ) {
$result[$keyA] = $valA + $valB;
// or if you do not care output keys, just
// $result[] = $valA + $valB;
}
}
}
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 the id
index association.
Example https://3v4l.org/ndv2j
$first = array_column($first, null, 'id');
$second = array_column($second, null, 'id');
$result = array_values(array_replace_recursive($first, $second));
Result
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[2] => Array
(
[id] => 7
[name] => Science
[title] => Sci
)
[3] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
Do not use foreach in foreach,that might be too slow when the array so big.
$idArray = array_column($secondArray,'title','id');
foreach($firstArray as $key => $val){
$firstArray[$key]['title'] = (isset($idArray[$val['id']])) ? $idArray[$val['id']] : 'some title';
}