Home > database >  Overwrite rows in one array using another array when two columns are shared between the arrays
Overwrite rows in one array using another array when two columns are shared between the arrays

Time:10-20

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);

Run in 3v4l

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);
  • Related