2016-04-29 112 views
0

对于我的生活,我无法在互联网上找到有关如何解决我的问题的任何文档的任何地方。我已经看到了大量计算时间差异的方法,但我似乎无法将一些适合我情况的东西放在一起。PHP - 多时差计算

我目前正在构建一个时间管理/门票系统,它是一个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我已经摸索出了while循环,但它无法正常工作。以下是我有:

$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); 
} 
+0

任何人都可以帮我理清while循环吗? – Mason

回答

0

如果要循环两个数组在同一时间,你可以使用PHP函数通过操纵其内部指针遍历数组:currentnextresetendprev

你只需要做出一个while循环:

while (($startTime = current($startTimes)) !== false && ($endTime = current($endTimes) !== false) { 
    // ... Do things 

    next($startTimes); 
    next($endTimes); 
} 

查看文档nextcurrent

+0

如何在while循环中对这样的数组进行计算: Start Times = '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([时间] => 2016-04-29 12:11:59))' (相同格式的结束时间) – Mason

+0

您可以使用['array_column'](http://php.net/manual/en/function .array-column.php)将数组获取到一个维度:'$ startTimes = array_column($ startTimes,'time');' - 然后使用我展示的while循环。 – Scopey

+0

好吧我近...这是我的while循环的样子,但它不起作用。你能指出什么是错的吗? '而(($ STARTTIME =电流($ startTimes))!= =假&&($结束时间=电流($ endTimes)!== FALSE){ \t \t \t \t \t \t \t \t \t \t \t \t $ startTimesConv =的strtotime($ startTimes); \t \t \t \t \t \t $ endTimesConv =的strtotime($ endTimes); \t \t \t \t \t \t $ totalTime =($ startTimesConv - $ endTimesConv)/ 60/60; \t \t \t \t \t \t \t \t \t \t \t \t下一个($ startTimes); \t \t \t \t \t \t next($ endTimes); \t \t \t \t \t} ' – Mason

0

我会退后一步,看看查询本身。您试图在数据库中两次相关的计算之间进行计算,但通过将时间分隔为两个单独的数组,会损失关系。或者至少与数组索引不明确相关。

我的伪代码是这样的:

#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 

如果你表现出一些细节,我也许可以扩大。 (即查询本身)

0

要遍历两个经常数组长度相同使用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的差异。

+0

我不是太熟悉SQL,我知道的基本知识,知道足以让周围。你会如何推荐使用SQL路线来进行计算? – Mason

+0

加入您的查询,并使用DATEDIFF。请参阅https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff –