简体   繁体   中英

merge/overwrite values in one array with values from another

I've looked through the other similar questions but couldnt find one that matched what I was trying to do.

I have 2 arrays, with different keys, and of different lengths. I need to update the values of one array with the values of the second. The second array will be of variable length, it is not set at a specific number.

$times = [
        [ 'time' => '00:00', 'status' => 'unset' ],
        [ 'time' => '01:00', 'status' => 'unset' ],
        [ 'time' => '02:00', 'status' => 'unset' ],
        [ 'time' => '03:00', 'status' => 'unset' ],
        [ 'time' => '04:00', 'status' => 'unset' ],
        [ 'time' => '05:00', 'status' => 'unset' ],
        [ 'time' => '06:00', 'status' => 'unset' ],
        [ 'time' => '07:00', 'status' => 'unset' ],
        [ 'time' => '08:00', 'status' => 'unset' ],
        [ 'time' => '09:00', 'status' => 'unset' ],
        [ 'time' => '10:00', 'status' => 'unset' ],
        [ 'time' => '11:00', 'status' => 'unset' ],
        [ 'time' => '12:00', 'status' => 'unset' ],
        [ 'time' => '13:00', 'status' => 'unset' ],
        [ 'time' => '14:00', 'status' => 'unset' ],
        [ 'time' => '15:00', 'status' => 'unset' ],
        [ 'time' => '16:00', 'status' => 'unset' ],
        [ 'time' => '17:00', 'status' => 'unset' ],
        [ 'time' => '18:00', 'status' => 'unset' ],
        [ 'time' => '19:00', 'status' => 'unset' ],
        [ 'time' => '20:00', 'status' => 'unset' ],
        [ 'time' => '21:00', 'status' => 'unset' ],
        [ 'time' => '22:00', 'status' => 'unset' ],
        [ 'time' => '23:00', 'status' => 'unset' ],
    ];

$times is the array that I need to update the values of, $times will always have an index of 24 (24 hours in a day right). The other array $slots will look something like this (I've trimmed it down for brevity)

$slots = [
        [
            'id'          => '104',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'available',
            'start_time'  => '2017-08-01 12:00:00',
            'end_time'    => '2017-08-01 13:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
        [
            'id'          => '105',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'available',
            'start_time'  => '2017-08-01 15:00:00',
            'end_time'    => '2017-08-01 16:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
        [
            'id'          => '106',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'unavailable',
            'start_time'  => '2017-08-01 17:00:00',
            'end_time'    => '2017-08-01 18:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
    ];

OK so what I need to do, is update the $times array with the status of the $slots array where the $slots start_time matches the $times time

In order to get the time and start_time to match, I am using the following code

foreach ( $slots as $slot ) {
            $slot_time = new DateTime( $slot[ 'start_time' ] );
            $slot_time = $slot_time->format( 'H:i' );}

You are in right direction. You can do following;

$times_time = array_column($times, "time"); //only contain `time` values

foreach ( $slots as $slot ) {
    $slot_time = new DateTime( $slot[ 'start_time' ] );
    $slot_time = $slot_time->format( 'H:i' );
    $search_key = array_search($slot_time,$times_time);    
    if($search_key>0){ //search key
      $times[$search_key]['status']=$slot[ 'status' ];
    }
}
print_r($times);

Demo

you add this code to your last foreach
The ampersand & let the value $t of the array be modifiable

foreach ( $slots as $slot ) {
            $slot_time = new DateTime( $slot[ 'start_time' ] );
            $slot_time = $slot_time->format( 'H:i' );

            foreach ($times as &$t)
                if( $t['time']==$slot_time){
                    $t['status']=$slot['status'];
                }
        }

and here's the output of the execution , where I have used print_r($times);

<html>
<head>
<title>Online PHP Script Execution</title>
</head>
<body>
<?php


$times = [
        [ 'time' => '00:00', 'status' => 'unset' ],
        [ 'time' => '01:00', 'status' => 'unset' ],
        [ 'time' => '02:00', 'status' => 'unset' ],
        [ 'time' => '03:00', 'status' => 'unset' ],
        [ 'time' => '04:00', 'status' => 'unset' ],
        [ 'time' => '05:00', 'status' => 'unset' ],
        [ 'time' => '06:00', 'status' => 'unset' ],
        [ 'time' => '07:00', 'status' => 'unset' ],
        [ 'time' => '08:00', 'status' => 'unset' ],
        [ 'time' => '09:00', 'status' => 'unset' ],
        [ 'time' => '10:00', 'status' => 'unset' ],
        [ 'time' => '11:00', 'status' => 'unset' ],
        [ 'time' => '12:00', 'status' => 'unset' ],
        [ 'time' => '13:00', 'status' => 'unset' ],
        [ 'time' => '14:00', 'status' => 'unset' ],
        [ 'time' => '15:00', 'status' => 'unset' ],
        [ 'time' => '16:00', 'status' => 'unset' ],
        [ 'time' => '17:00', 'status' => 'unset' ],
        [ 'time' => '18:00', 'status' => 'unset' ],
        [ 'time' => '19:00', 'status' => 'unset' ],
        [ 'time' => '20:00', 'status' => 'unset' ],
        [ 'time' => '21:00', 'status' => 'unset' ],
        [ 'time' => '22:00', 'status' => 'unset' ],
        [ 'time' => '23:00', 'status' => 'unset' ],
    ];

$slots = [
        [
            'id'          => '104',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'available',
            'start_time'  => '2017-08-01 12:00:00',
            'end_time'    => '2017-08-01 13:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
        [
            'id'          => '105',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'available',
            'start_time'  => '2017-08-01 15:00:00',
            'end_time'    => '2017-08-01 16:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
        [
            'id'          => '106',
            't_id'        => '41',
            'u_id'        => null,
            'status'      => 'unavailable',
            'start_time'  => '2017-08-01 17:00:00',
            'end_time'    => '2017-08-01 18:00:00',
            'update_time' => '0000-00-00 00:00:00',
        ],
    ];

    $param = array();

    for($i=0;$i<count($times);$i++){
        for($j=0;$j<count($slots);$j++){
            if($times[$i]['time']==date('H:i',strtotime($slots[$j]['start_time']))){
                $times[$i]['start_time'] = date('H:i',strtotime($slots[$j]['start_time']));
                $param[$i]['time']=$times[$i]['time'];
                $param[$i]['status'] = $times[$i]['status'];
                $param[$i]['start_time'] = $times[$i]['start_time'];
            }

        }
    }
    print_r($param);
?>

</body>
</html>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM