确定要增量PHP的数据点

确定要增量PHP的数据点,php,arrays,loops,Php,Arrays,Loops,我创建了一个阵列,每间隔1天有10个时间戳: $data_points = array(); $now = time(); $one_day = 60 * 60 * 24; for($i = 1; $i <= 10; ++$i) { $key = $now - ($one_day * $i); $data_points[$key] = 0; } print_r($data_points); Array ( [1328642414] => 0 [13285

我创建了一个阵列,每间隔1天有10个时间戳:

$data_points = array();
$now = time();
$one_day = 60 * 60 * 24;

for($i = 1; $i <= 10; ++$i) {
  $key = $now - ($one_day * $i);
  $data_points[$key] = 0;
}

print_r($data_points);

Array
(
    [1328642414] => 0
    [1328556014] => 0
    [1328469614] => 0
    [1328383214] => 0
    [1328296814] => 0
    [1328210414] => 0
    [1328124014] => 0
    [1328037614] => 0
    [1327951214] => 0
    [1327864814] => 0
)
$data_points=array();
$now=时间();
$1天=60*60*24;
对于($i=1;$i=0)
[1328556014] => 0
[1328469614] => 0
[1328383214] => 0
[1328296814] => 0
[1328210414] => 0
[1328124014] => 0
[1328037614] => 0
[1327951214] => 0
[1327864814] => 0
)
现在我有一系列的任务在过去10天的不同时间开始,我想看看我的任务是在哪一天开始的

我将循环遍历每个
$data\u点
,查看开始时间是否大于当前日期而小于下一天,然后增加该数据点

有更好的方法吗


谢谢

为了缩短搜索时间,您可以将数据放入二叉搜索树而不是简单的数组中

这是否值得麻烦取决于您的数据集有多大。当然,当你添加新的日期时,你也必须经常重新平衡你的树。

你可以使用

**已更新,以避免在评论中使用DateTime**

$now = date('Ymd');
$task = date('Ymd',$tasktime);
$interval = $task - $now;

间隔是您期望的数字。

我认为有一个更好的方法

假设在数组中有任务开始时间戳,则算法类似于:

for each task starting timestamp
    timestamp <- $now - timestamp // you will obtain task age in seconds
    timestamp <- timestamp / (60*60*24) // you will obtain task age in days
    // round resulting timestamp with a precision of 0 if you want to obtain the task age in integer days.
end for each
每个任务开始时间戳的


时间戳我知道这个问题很老了,但因为没有公认的答案,而且这似乎是一个有趣的问题-我们开始吧

根据您的问题,您的算法的值为
O(10n)
,其中
n
是任务数。这意味着,与很多事情相比,它是相当有效的。正如所指出的,二元搜索树在拥有
O(log(n))
时会更快,但是实现它并不值得在处理过程中节省时间。不过,您可以使用以下方法使其稍微更高效,并得到一个
O(n)

$now = time();
$oneDay = 86400; //60 * 60 * 24
foreach($tasks as $task) {
    //assuming now that $task is the timestamp of the task
    //extra paranthesis added for easier reading
    $dif = $now - ($oneDay * ceil(($now - $task) / $oneDay));
    $data_points[$dif]++;
}
差异中的数学如下所示
$now-$task
是以秒为单位的两个时间戳之间的差值,我们除以
$oneDay
得到任务过去发生的天数。现在,假设
$Now
是新的一天的开始,如果一个事件发生在12小时前,它是“昨天”,我们使用
ceil
将其四舍五入到下一个整数,因此“.5”变为“1”。在此基础上,我们乘以
$oneDay
以获得已过去天数的秒数-使用您先前创建的
$data\u points
数组。然后,我们将该结果从
$now
中减去,再次使用
$data\u points
数组。这个结果给了我们一个时间戳,我们可以使用它来匹配您创建的数组中的时间戳,我们使用它作为它的“键”,并相应地递增

这将避免您必须为每个任务循环整个
$data\u点
数组,从而将其复杂性从
O(10n)
降低到
O(n)


无论如何,我希望这个答案能帮助解释为什么你的公式没有那么低效,但也能说明如何使它变得更加高效。

你可以使用“yyy-mm-dd”,然后使用DateTime而不是timestamp,并使用DateTime->format()增加相应的天数,而不是在数组中使用时间戳。任务数组是什么样子的?如果没有DateTime,可以使用
date
获取时间戳的“Y-m-d”格式表示。我应该更清楚,数据点相隔1天,但它们不会在00:00到23:59之间。它们可能在08:56到08:55之间。不幸的是,DateTime类插件在我的环境中不可用
$now = time();
$oneDay = 86400; //60 * 60 * 24
foreach($tasks as $task) {
    //assuming now that $task is the timestamp of the task
    //extra paranthesis added for easier reading
    $dif = $now - ($oneDay * ceil(($now - $task) / $oneDay));
    $data_points[$dif]++;
}