2017-08-02 58 views
1

我已经查看了其他类似的问题,但找不到与我正在尝试执行的操作相匹配的问题。合并/覆盖一个数组中的值与另一个数值

我有2个数组,有不同的键和不同的长度。我需要用第二个值更新一个数组的值。第二个数组的长度是可变的,它没有设置为特定的数字。

$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是我需要更新的,$times的值将总是具有(在一天24小时右)24的索引的数组。其他阵列$slots会是这个样子(我修剪下来的简洁)

$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', 
     ], 
    ]; 

行,所以我需要做的,就是更新$times阵列与$slots阵列的status其中$slotsstart_time匹配$timestime

为了获得timestart_time匹配,我使用下面的代码

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

回答

0

您将此代码添加到您的最后foreach
的符号&让数组的值$t可修改

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']; 
       } 
     } 

和这里的execution的输出,其中我已经使用print_r($times);

+0

呵呵,我基本上是自己写的,但是因为它不起作用而被删除,结果我错过了&,我给了这个接受的答案,因为它比下面的答案稍快 – virtualLast

0

你是正确的方向。你可以做以下事情;

$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

+0

感谢您的回答,真的很喜欢它,并赞赏演示,上面的答案稍快,这就是为什么我给了它接受的答案 – virtualLast

+0

嗯它你真的注意到并检查输出时间。我的建议会稍微快一点,因为它可以消除循环中不需要的循环。 @virtualLast –

+0

[eval](https://eval.in/840562) [eval2](https://eval.in/840560) 我看错了吗?使用PHP 7,我应该看哪个值? – virtualLast

0
<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> 
相关问题