【问题标题】:PHP for loop datesPHP for 循环日期
【发布时间】:2015-01-20 17:23:22
【问题描述】:

我正在尝试创建一个 for 循环,在其中指定开始日期和结束日期,并且我想提取随机混合的日期,其中每个日期总是晚于前一个日期并早于下一个日期。

我不需要预定义的一组日期,我可能有 10 个 - 我可能有 100 个或 1000 个,只要它们存在于开始日期和结束日期内。

例子:

2015-01-15 08:06:00
2015-01-15 15:23:42
2015-01-16 06:03:00
.........
.........
2015-01-20 08:18:32

这就是我所拥有的(这是错误的):

$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');

for ($i=$start;$i<$end;$i++) {

  //Current time + Anywhere between 1 hour and 3 days
   $x = $i + (int)rand(3600,259200);  

   echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";       
}

在我的测试中,我没有得到任何结果...我相信循环正在无限运行...或者其他问题。

谁能帮忙?

【问题讨论】:

  • 你的逻辑似乎有缺陷。如果您将随机时间量添加到当前日期序列,使您超过结束日期但仍少于您要生成的日期数,会发生什么情况?您似乎需要做的是查看开始日期和结束日期之间的时间以及迭代次数以确定日期之间的平均日期间隔,然后引入抖动以随机化 +- 一些时间到该平均值。然后,您需要查看到最后的剩余时间并在每次迭代时重新计算。
  • 您的变量 $end 等于 1421769479 :),这是一个巨大的数字
  • @smarber 但$start 也是一个庞大的数字,比$end 少了大约一百万
  • 循环数约为865k。这是大量的迭代,需要一些时间才能完成(我猜是十几秒)并产生大约 24 MiB 的输出。这不是因为它没有结束运行,而是浏览器没有针对处理和渲染这么大的文档进行优化。

标签: php date for-loop


【解决方案1】:

如果我正确地收集了您的问题,那么您的处理方式似乎是错误的。最简单的方法是在一个范围内($start 和$end 之间)生成随机时间,然后对它们进行排序。这样你在选择随机间隔时就不必猜测你还剩下多少时间空间。

$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');


$num_randoms = 10;

for ($i=0;$i<$num_randoms;$i++) {

   $dates []= (int)rand($start,$end);  

}

sort($dates);
foreach ($dates as $x) {

   echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";       

}

【讨论】:

  • 引入了必须排序的需求,只是让代码变得更加复杂。
  • @ultrajohn 但工作。如果没有排序,你将如何获得排序结果?
  • @martti 请检查我上面建议的答案。
  • @ultrajohn 将给出不同的结果,在每个相等间隔的时间段(您的答案)中随机与开始和结束之间的随机(amphetmachine)。目前还不清楚 OP 想要获得什么。
  • @martti 这让我很好奇,所以我在 stat.se.com stats.stackexchange.com/questions/134241/… 上询问了这个问题
【解决方案2】:

你以为这两个就是你的约会对象

$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');

您还假设您将使用特定范围的秒数来生成伪随机数

$min = 3600; // 1 hour
$max = 259200; // 72 hours (3 days)

您需要做的第一步是在最大范围内减少结束秒数。这将向您保证后一个日期将在指定日期之前

$end -= $max;

最后是正确的循环。我使用了while 循环,因为它更具可读性。

while ($start < $end) {
    $start += (int) mt_rand($min, $max); // add the generated value to the start seconds
    echo date('Y-m-d H:i:s', $start);
}

PS。注意我使用了mt_rand 函数

【讨论】:

  • 这似乎比 for 循环好得多,但我无法让它工作。它显示为空白。
【解决方案3】:

使用您的日期值的毫秒表示。伪代码如下:

  1. 将开始日期转换为其毫秒表示sm
  2. 将结束日期转换为毫秒表示em
  3. 对于 i = 0 到 n,n 是日期数...
    3.1 在sm和sm + offset之间随机化一些值
    3.2 将生成的值转换成它的日期对象表示

    3.3 分配sm = sm + offset 并检查是否sm &lt; em

    offset是采样间隔的大小,offset &lt;= (em - sm) / n

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2017-06-20
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多