PHP实现时间段预订统计时数组重复键名值累加需求
实现重复时间戳键的场地空间值累加统计
我之前也碰到过类似的需求——要统计特定时间段内的已预订事件对应的场地空间总和,想用时间戳组合作为数组键,值对应场地空间的累加值。先看看现有数据源$data的结构:
Array ( [0] => stdClass Object ( [id] => 7 [start] => 2019-06-30 [end] => 2019-06-30 [start_time] => 11:00:00 [end_time] => 12:00:00 [hall_space] => 2 ) [1] => stdClass Object ( [id] => 9 [start] => 2019-06-30 [end] => 2019-06-30 [start_time] => 11:00:00 [end_time] => 12:00:00 [hall_space] => 2 ) )
最开始写的代码逻辑是用带循环索引的键来避免覆盖,但这样没法实现累加;如果去掉索引,重复的键又会直接覆盖原有值,只能保留最后一个值:
$booked = array(); foreach($data as $dk => $dv){ $time_stamp = strtotime($dv->start.' '.$dv->start_time).'_'.strtotime($dv->end.' '.$dv->end_time).'_'.$dk; $booked[$time_stamp] = $dv->hall_space; // 这里注意原代码里的`rink_space`应该是数据源里的`hall_space`,要对应上字段名 }
想要实现键重复时自动累加值的话,只需要调整循环里的逻辑,判断键是否存在即可:
$booked = array(); foreach($data as $dv){ // 生成统一的时间戳组合键,去掉循环索引 $time_stamp = strtotime($dv->start.' '.$dv->start_time) . '_' . strtotime($dv->end.' '.$dv->end_time); // 判断键是否存在,存在则累加,不存在则赋值 if(isset($booked[$time_stamp])){ $booked[$time_stamp] += $dv->hall_space; } else { $booked[$time_stamp] = $dv->hall_space; } }
执行这段代码后,就能得到期望的累加结果:
Array ( [1561892400_1561896000] => 4 )
内容的提问来源于stack exchange,提问作者Aayush Dahal
相关产品推荐
相关产品推荐

