php - 从睡眠/唤醒标记数组中获取平均清醒时间
问题描述
我一直在绞尽脑汁想弄清楚这件事……
我需要AwakeDuration
进入以下数组。
Array
(
[0] => Array
(
[WentToSleep] => 2019-07-24 15:45:00
[WokeUp] => 2019-07-24 22:10:00
[SleepDuration] => 6:25
)
[1] => Array
(
[WentToSleep] => 2019-07-23 15:25:00
[WokeUp] => 2019-07-23 23:00:00
[SleepDuration] => 7:35
)
[2] => Array
(
[WentToSleep] => 2019-07-22 12:45:00
[WokeUp] => 2019-07-22 23:00:00
[SleepDuration] => 10:15
)
[3] => Array
(
[WentToSleep] => 2019-07-21 13:00:00
[WokeUp] => 2019-07-21 21:00:00
[SleepDuration] => 8:00
)
[4] => Array
(
[WentToSleep] => 2019-07-20 11:10:00
[WokeUp] => 2019-07-20 20:00:00
[SleepDuration] => 8:50
)
[5] => Array
(
[WentToSleep] => 2019-07-19 09:00:00
[WokeUp] => 2019-07-19 16:30:00
[SleepDuration] => 7:30
)
[6] => Array
(
[WentToSleep] => 2019-07-18 06:00:00
[WokeUp] => 2019-07-18 14:05:00
[SleepDuration] => 8:05
)
[7] => Array
(
[WentToSleep] => 2019-07-17 05:15:00
[WokeUp] => 2019-07-17 13:30:00
[SleepDuration] => 8:15
)
)
这来自以下代码:
$json = '[{"Sleep":"2019-07-24 15:45:00","Wake":"2019-07-24 22:10:00"},{"Sleep":"2019-07-23 15:25:00","Wake":"2019-07-23 23:00:00"},{"Sleep":"2019-07-22 12:45:00","Wake":"2019-07-22 23:00:00"},{"Sleep":"2019-07-21 13:00:00","Wake":"2019-07-21 21:00:00"},{"Sleep":"2019-07-20 11:10:00","Wake":"2019-07-20 20:00:00"},{"Sleep":"2019-07-19 09:00:00","Wake":"2019-07-19 16:30:00"},{"Sleep":"2019-07-18 06:00:00","Wake":"2019-07-18 14:05:00"},{"Sleep":"2019-07-17 05:15:00","Wake":"2019-07-17 13:30:00"}]';
$SleepWakeArray = json_decode($json, true);
foreach ($SleepWakeArray AS $results) {
$SleepDiff = (new DateTime($results['Sleep']))->diff(new DateTime($results['Wake']));
$SleepDuration = $SleepDiff>h . ':' . str_pad($SleepDiff>i,2,'0',STR_PAD_LEFT);
$array[] = [
'WentToSleep' => $results['Sleep'],
'WokeUp' => $results['Wake'],
'SleepDuration' => $SleepDuration,
];
}
我无法弄清楚的是如何计算一个新值,AwakeDuration
就像人们所说的那样。
所以,我想我需要使用醒来的时间[1][Wake]
(例如)和最近睡觉的时间[0][Sleep]
diff()
然后做[1][Wake]
一个[0][Sleep]
所以类似这样的事情......
$WentToSleep = new DateTime('2019-07-24 15:45:00'); // `[0][Sleep]`
$WokeUp = new DateTime('2019-07-23 23:00:00'); // `[1][Wake]`
$Diff = $WentToSleep->diff($WokeUp);
$Duration = $Diff->h . ':' . str_pad($Diff->i,2,'0',STR_PAD_LEFT);
但是如何在代码中计算出这种逻辑,今天让我脑筋急转弯,希望有人能帮助我。
解决方案
这是一种集体休息。
您循环排序数据(强制性!)。记住使用变量的下一次调用的最后“唤醒”时间(init with null)。当它不为null时,进行计算(第一个条目不能有它,只有你预设了'wokeup')。用当前的更新“唤醒”。
$wokeup = null;
foreach( ... as $data) {
if (null !== $wokeup) {
// calculate wake time "last wake" till "current sleep"
}
// update last woke up
$wokeup = $data['wake'];
}
推荐阅读
- javascript - onClick 和 event.target 不起作用反应
- python - 将 2 个不同维度的 tensorflow cnn 层相乘以用于注意力 cnn 时出错
- javascript - iPad:点击文档在每个浏览器上的行为不同
- node.js - 使用 Nodejs 处理 Firebase 中的多个功能
- php - 如何使用php合并两个pdf文件
- unity3d - 如何重置 DontDestroyLoad 下的游戏对象?
- laravel - 使用 Laravel sanctum 进行 Laravel 默认身份验证返回 419 错误代码
- json - django嵌套模型json导入
- python - 我正在尝试使用 librosa 读取波形文件,但出现以下错误。为什么我会收到此错误,我该如何解决?
- angular - 带有 Hls.xhr.beforeRequest 问题的 Angular 8 动态 Videojs