I got 2 arrays. In first one field number is empty:
array (
3 => array ( 0 => array ( 'id' => 1, 'number' => 0, 'time' => 40,), ),
4 => array ( 0 => array ( 'id' => 2, 'number' => 0, 'time' => 40, ), ),
5 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 40, ), ),
6 => array ( 0 => array ( 'id' => 1, 'number' => 0, 'time' => 41, ), ),
7 => array ( 0 => array ( 'id' => 2, 'number' => 0, 'time' => 41, ), ),
8 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 41, ), ),
)
In the second one fields number are not empty, however the array is bit different, because it doesn't have a 2 arrays in the middle (id = 3
, time = 40
and id = 3, time = 41
).
array ( 3 => array ( 'id' => '1', 'number' => '3785', 'time' => '40', ),
4 => array ( 'id' => '2', 'number' => '1574', 'time' => '40', ),
5 => array ( 'id' => '1', 'number' => '2954', 'time' => '41', ),
6 => array ( 'id' => '2', 'number' => '2463', 'time' => '41', ),
)
What I want to do is to some sort of merge of this arrays into one looking like this:
array (
3 => array ( 'id' => '1', 'number' => '3785', 'time' => '40', ),
4 => array ( 'id' => '2', 'number' => '1574', 'time' => '40', ),
5 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 40, ), ),
6 => array ( 'id' => '1', 'number' => '2954', 'time' => '41', ),
7 => array ( 'id' => '2', 'number' => '2463', 'time' => '41', ),
8 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 41,), ),
)
I tried some variations of array_merge()
and array_combine()
, but neither of them seems to work, or perhaps I've been using them badly.
Again, notice how row 5
and 8
are not affected because (id = 3
and time = 40
) and (id = 3
and time = 41
), respectively, are not represented in the second array.
What I tried and it works, but it doesn't look well in my opinion:
foreach($arr2 as $wpis2){
foreach($arr as $key=>$wpis){
if($wpis2['id'] == $wpis[0]['id'] && $wpis2['time'] == $wpis[0]['time']){
$arr[$key] = $wpis2;
}
}
}
CodePudding user response:
The second array is converted into an array with id as key, and the first foreach goes to query
$first = [
3 => [0 => ['id' => 1, 'number' => 0, 'time' => 40,],],
4 => [0 => ['id' => 2, 'number' => 0, 'time' => 40,],],
5 => [0 => ['id' => 3, 'number' => 0, 'time' => 40,],],
6 => [0 => ['id' => 1, 'number' => 0, 'time' => 41,],],
7 => [0 => ['id' => 2, 'number' => 0, 'time' => 41,],],
8 => [0 => ['id' => 3, 'number' => 0, 'time' => 41,],],
];
$second = [3 => ['id' => '1', 'number' => '3785', 'time' => '40',],
4 => ['id' => '2', 'number' => '1574', 'time' => '40',],
5 => ['id' => '1', 'number' => '2954', 'time' => '41',],
6 => ['id' => '2', 'number' => '2463', 'time' => '41',],
];
$result = [];
$secondMap = array_column($second, null, 'id');
foreach ($first as $key => $value) {
foreach ($value as $item) {
if (isset($secondMap[$item['id']])) {
$result[$key] = $secondMap[$item['id']];
} else {
$result[$key] = $value;
}
}
}
var_dump($result);
CodePudding user response:
You will need to iterate over the first array in order to populate a key-map based on the combination of id
and time
values from all rows.
Use a second loop to iterate over the second array and access the correct key to overwrite by leveraging the mapping array.
Code: (Demo)
$map = [];
foreach ($first as $k => [['id' => $id, 'time' => $time]]) {
$map["{$id}_{$time}"] = $k;
}
foreach ($second as $row) {
$key = $map["{$row['id']}_{$row['time']}"];
$first[$key] = $row;
}
var_export($first);