Рандомная дата в цикле - PHP

12
D
На сайте с 28.06.2008
Offline
980
760

Подскажите плиз как можно реализовать рандомную дату в цикле, которая будет старше даты в предыдущей итерации?

Сейчас у меня так

foreach ($result2 as $value){
$start = mktime(0,0,0,1,1,2018);
$end = mktime(0,0,0,8,11,2019);
$randomStamp = rand($start,$end);
$date = date('Y-m-d h:i',$randomStamp);

Далее пишу отзывы в базу, для которых и генерирую дату. Но на странице отзывы выстраиваются по ID и сразу бросается в глаза что даты идут в разнобой.

Мне нужно чтобы в цикле 1-я итерация записывалась произвольная дата из заданного промежутка, а следующая дата была так же рандомная но не раньше по времени чем дата в прошлой итерации. Всего итераций может быть от 1 до 5

S
На сайте с 30.09.2016
Offline
459
#1

Это не проблема PHP, это проблема логики и алгоритма.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
B3
На сайте с 01.04.2010
Offline
82
#2


$start = mktime(0,0,0,1,1,2018);
$end = mktime(0,0,0,8,11,2019);
foreach ($result2 as $value){
$randomStamp = $start = rand($start,$end);
$date = date('Y-m-d h:i',$randomStamp);
}
Gerga
На сайте с 02.08.2015
Offline
89
#3

Dram,


$date = new DateTime();

for ($i = 0; $i <= 10; $i++) {
/* тут разный код */

$date->modify('+1 DAY');
}

или


define('MINUTES_PER_DAY', 1440);

$date = new DateTime();

for ($i = 0; $i <= 10; $i++) {
/* тут разный код */

$minutes = rand(
MINUTES_PER_DAY / 2,
MINUTES_PER_DAY
);

$date->modify(sprintf('+%d minute', $minutes));
}
D
На сайте с 28.06.2008
Offline
980
#4

Byblick32, спасибо, то что нужно, а можете объяснить код, не могу понять строчку

$randomStamp = $start = rand($start,$end);

Gerga
На сайте с 02.08.2015
Offline
89
#5
Dram:
$randomStamp = $start = rand($start,$end);

https://www.php.net/manual/ru/function.rand.php

D
На сайте с 28.06.2008
Offline
980
#6

Ааа все понял, спс. Мы в каждом цикле запоминаем старт и стартуем уже с него. Изящно, спс!

S
На сайте с 30.09.2016
Offline
459
#7

Я тоже поучаствую в олимпиаде, так и быть.

$q = 5;
$start = mktime(0,0,0,1,1,2018);
$end = mktime(0,0,0,8,11,2019);
$step = ($end-$start)/$q;
$s = $start;
$e = $start+$step;

for($i=0;$i<$q;$i++){
$randomStamp = rand($s,$e);
$date = date('Y-m-d h:i',$randomStamp);
$s = $e+1;
$e += $step;
}

Правда, я тут не учёл foreach ($result2 as $value), как-то не обратил внимания. Но это просто немного поменять цикл надо.

D
На сайте с 28.06.2008
Offline
980
#8

Sitealert, не так красиво как у Byblick32, вы проиграли :)

S
На сайте с 30.09.2016
Offline
459
#9

Это ты просто не понимаешь. Вот что, например выдало при использовании бубликового кода при одном из прогонов:

2019-03-27 06:20

2019-08-08 12:29

2019-08-09 08:32

2019-08-10 09:09

2019-08-10 10:04

Сомнительная красота, кмк.

Samail
На сайте с 10.05.2007
Offline
328
#10

А что если при первой итерации сгенерируется максимальное число, что маловероятно но возможно. Может лучше генерировать секунды которые нужно прибавить к предыдущей дате. Или сразу сгенерировать столько дат сколько элементов в $result2, и отсортировать по возрастанию:

$start = mktime(0,0,0,1,1,2018);
$end = mktime(0,0,0,8,11,2019);

$count = count($result2);

$random = array();
for ($i = 0; $i < $count; $i++) {
$random[$i] = rand($start,$end);
}
sort($random);

$i = 0;
foreach ($result2 as $value){
$date = date('Y-m-d h:i',$random[$i]);
$i++;
}
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий