就我而言,我在互联网上找不到任何关于如何解决我的问题的文档。我已经看到了很多计算时间差异的方法,但我似乎无法将适合我的情况的方法组合在一起。
我目前正在构建一个时间管理/票务系统,它是WordPress的插件。我使用的是自定义表格,而不是WordPress表格。我有一个表包含所有主票信息,另一个表则包含所有开始/停止时间。一旦用户将票证标记为完成,它将获取所有的开始/停止时间值并计算所花费的总时间,然后将该总时间值放入主票证表的"total_time"列中。
我正在查询数据库,并通过以下方式获取开始/停止时间:$start_times = $wpdb->get_results($start_times_query);
$stop_times = $wpdb->get_results($stop_times_query);
现在我有了2个数组中的信息。我应该这样做吗?
数组给出以下信息(用于开始时间):Array ( [0] => Array ( [time] => 2016-04-29 12:02:43 ) [1] => Array ( [time] => 2016-04-29 12:04:18 ) [2] => Array ( [time] => 2016-04-29 12:06:07 ) [3] => Array ( [time] => 2016-04-29 12:07:56 ) [4] => Array ( [time] => 2016-04-29 12:10:30 ) [5] => Array ( [time] => 2016-04-29 12:11:59 ) )
(结束时间格式相同)
然后我使用分解阵列
$startTimes = array_column($startTimes, 'time');
$endTimes = array_column($endTimes, 'time');
现在我得到了这个数组(这个只是开始时间,但结束时间的格式相同):
Array ( [0] => 2016-04-29 12:02:43 [1] => 2016-04-29 12:04:18 [2] => 2016-04-29 12:06:07 [3] => 2016-04-29 12:07:56 [4] => 2016-04-29 12:10:30 [5] => 2016-04-29 12:11:59 )
通常我可以做一个foreach ($start_time as $time){}
来遍历所有的值,但(如果我错了,请纠正我)我不能把两个数组放在foreach括号中,也不能把另一个foreach语句放在当前数组中,因为这样它只会返回第二个数组的所有时间,而只返回第一个数组的一个值。我觉得我错过了一些简单的事情,我能做些什么来实现这一点?
编辑
多亏了Scopey,我做了一段时间的循环,但它运行不正常。这是我所拥有的:
$startTimes = array_column($startTimes, 'time');
$endTimes = array_column($endTimes, 'time');
while (($startTime = current($startTimes)) !== false && ($endTime = current($endTimes) !== false)) {
$startTimesConv = strtotime($startTimes);
$endTimesConv = strtotime($endTimes);
$totalTime = ($startTimesConv - $endTimesConv)/60/60;
next($startTimes);
next($endTimes);
}
如果您想同时循环两个数组,可以使用PHP函数通过操作数组的内部指针来遍历数组:current
、next
、reset
、end
和prev
。
你只需要做一个循环:
while (($startTime = current($startTimes)) !== false && ($endTime = current($endTimes) !== false) {
// ... Do things
next($startTimes);
next($endTimes);
}
请参阅next
和current
的文档
要迭代两个长度相同的正则数组,请使用for
而不是foreach
:
$length = count($start_times);
for ($i = 0; $i < $length; $i++) {
$start_time = $start_times[$i]["time"];
$stop_time = $stop_times[$i]["time"];
// do things
}
但在您的情况下,我强烈建议您计算SQL中的差异。
我会后退一步,看看查询本身。您试图在数据库中相关的两个时间之间进行计算,但是,将时间分隔成两个单独的数组会丢失关系。或者至少作为数组索引是模糊相关的。
我的伪代码看起来是这样的:
#For each ticket which is closed
#Get an array (time entries) of arrays (start, stop) (each having it's start and stop time)
#total_time = 0
#For each time entry
#Perform a time calc function to get_time_differnce(start, stop)
#Add the time to Total_time
#Add total_time to ticket record in DB
如果你展示更多的细节,我也许可以扩展。(即查询本身)