【问题标题】:PHP - Multiple Time Difference CalculationsPHP - 多重时差计算
【发布时间】:2016-08-25 04:45:09
【问题描述】:

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

我目前正在构建一个时间管理/票务系统,它是 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 括号中,也不能在当前一个,因为那样它将只为第二个数组返回所有时间,并且只为第一个数组返回一个值。我觉得我错过了一些简单的东西,我该怎么做才能做到这一点?

编辑
感谢 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);
}

【问题讨论】:

  • 谁能帮我整理一下while循环?

标签: php mysql arrays wordpress


【解决方案1】:

我会退后一步,看看查询本身。您正在尝试在数据库中相关的两个时间之间进行计算,但是,通过将时间分成两个单独的数组,这种关系会丢失。或者至少作为一个数组索引是模棱两可的。

我的伪代码如下所示:

#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

如果您显示更多细节,我可能会展开。 (即查询本身)

【讨论】:

    【解决方案2】:

    要迭代两个长度相同的常规数组,请使用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 中的差异。

    【讨论】:

    • 我对 SQL 不太熟悉,我知道基础知识并且知道的足够多。您如何建议使用 SQL 路由进行计算?
    • 加入您的查询,并使用 DATEDIFF。见dev.mysql.com/doc/refman/5.5/en/…
    【解决方案3】:

    如果你想同时循环两个数组,你可以使用 PHP 函数通过操作它们的内部指针来遍历数组:currentnextresetendprev

    你只需要做一个while循环:

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

    请参阅 nextcurrent 的文档

    【讨论】:

    • 如何在 while 循环中为这样的数组进行计算:开始时间 = Array ( [0] =&gt; Array ( [time] =&gt; 2016-04-29 12:02:43 ) [1] =&gt; Array ( [time] =&gt; 2016-04-29 12:04:18 ) [2] =&gt; Array ( [time] =&gt; 2016-04-29 12:06:07 ) [3] =&gt; Array ( [time] =&gt; 2016-04-29 12:07:56 ) [4] =&gt; Array ( [time] =&gt; 2016-04-29 12:10:30 ) [5] =&gt; Array ( [time] =&gt; 2016-04-29 12:11:59 ) ) (结束时间的格式相同)
    • 您可以使用 array_column 将该数组变为一维:$startTimes = array_column($startTimes, 'time'); - 然后只需使用我展示的 while 循环。
    • 好吧,我很接近了...这是我的 while 循环的样子,但它不起作用。你能指出什么是错的吗? while (($startTime = current($startTimes)) !== false &amp;&amp; ($endTime = current($endTimes) !== false) { $startTimesConv = strtotime($startTimes); $endTimesConv = strtotime($endTimes); $totalTime = ($startTimesConv - $endTimesConv)/60/60; next($startTimes); next($endTimes); }
    • 在主帖上查看编辑以获得更好的外观
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多