簡體   English   中英

php與while循環中的變量和時間

[英]php sum time with variable in while loop

while循環中的php sum變量我必須“匯總”變量的值,而這里是我的例子:

while($row = mysql_fetch_array($result)){
  $working_hour= $row[working_hour];
}

如果我輸入echo $working_hour;上面的代碼將輸出echo $working_hour; 例如:01:00:03,01:03:04,01:10:15我想要類似:sum($ working_hour)或array_sum($ working_hour)來計算while循環的所有結果。 所以,我想算一下:01:00:03,01:03:04,01:10:15 = 03:13:22我這樣試試:

$total_working_hour=’00:00:00’;
while($row = mysql_fetch_array($result)){
  $working_hour= $row[working_hour];
  $total_working_hour+= $working_hour;
}

Echo $total_working_hour;

上面的代碼提供輸出為:

03

我怎么能用PHP做到這一點? 謝謝

我在這里使用了答案( 如何對數組時間求和 )並創建了以下函數:

  function addTime($a, $b) {
    $array = [$a, $b];
    $totalTimeSecs = 0;
    foreach ($array as $time) { // Loop outer array
      list($hours,$mins,$secs) = explode(':',$time); // Split into H:m:s
      $totalTimeSecs += (int) ltrim($secs,'0'); // Add seconds to total
      $totalTimeSecs += ((int) ltrim($mins,'0')) * 60; // Add minutes to total
      $totalTimeSecs += ((int) ltrim($hours,'0')) * 3600; // Add hours to total
    }

    $hours = str_pad(floor($totalTimeSecs / 3600),2,'0',STR_PAD_LEFT);
    $mins = str_pad(floor(($totalTimeSecs % 3600) / 60),2,'0',STR_PAD_LEFT);
    $secs = str_pad($totalTimeSecs % 60,2,'0',STR_PAD_LEFT);
    return "$hours:$mins:$secs";
  }

所以你可以使用它並替換

$total_working_hour+= $working_hour;

$total_working_hour = addTime($total_working_hour, $working_hour);
   $hours=0;$min=0;$sec=0;
    while($row = mysql_fetch_array($result)){
      $working_hour= $row[working_hour];
        $arr=explode(':',$working_hour);
        $hours=$hours+$arr[0];
        $min=$min+$arr[1];
       if($min>60){$hours++;$min=$min-60;}
        $sec=$sec+$arr[2];
        if($sec>60){$min++;$sec=$sec-60;}
    }
    echo 'Total working hours='.$hours.':'.$min.':'.$sec;

$row["working_hour"]值顯然是一個字符串。 所以說"01:00:03" + "01:03:04"顯然毫無意義。 PHP假定您要做的是先將字符串轉換為整數然后將它們一起添加。 結果不是你真正追求的。

相反,您希望將類似"01:00:03"的字符串轉換為規范化的整數值,例如秒數,可以將它們一起添加,然后轉換回字符串值。

因此,要將字符串的規范化值以秒為單位得到整數,您需要這樣的函數...

function convertStringToNumSeconds($string) {
    list($hours, $minutes, $seconds) = explode(":", $string, 3);
    $totalSeconds = 0;
    $totalSeconds += $hours * 3600; // There are 3600 seconds in an hour
    $totalSeconds += $minutes * 60; // There are 60 seconds in a minute
    $totalSeconds += $seconds; // There is 1 second in a second
    return $totalSeconds;
}

然后將秒轉換回格式化的字符串,你可以做相反的事情......

function secondsToString($seconds) {
    $hours = (int) floor($seconds / 3600);
    $seconds -= $hours * 3600;
    $minutes = (int) floor($seconds / 60);
    $seconds -= $minutes * 60;
    return sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
}

現在在你的循環中你可以實際做這樣的事情......

$totalWork = 0;
while($row = mysql_fetch_array($result)){
  $totalWork += convertStringToNumSeconds($row["working_hour"]);
}
echo secondsToString($totalWork); // You should get your expected result

如果您的示例中的格式是修復的,您可以使用DateTime-Object和Date-Interval,就像這樣......(有關DateInterval的更多信息,請查看PHP-Docu)

    $dt = new \DateTime('00:00:00');
    foreach ($dbRows as $row) {

        $time = $row['working_hour'];
        $timeSplit = explode(':', $time);
        $interval = new \DateInterval(
            'P0Y0DT'.$timeSplit[0].'H'.
            $timeSplit[1].'M'.$timeSplit[2].'S'
        );
        $dt->add($interval);
    }

    echo $dt->format('H:i:s'); // Output: 03:13:22

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM