我试图在循环中每天显示一个数字。在到达最后一个元素之后,它需要再次到达第一个元素。这需要每天进行。我已经超出了我的大脑但没有设法解决它。功能需要按天/小时/分钟返回当前数字,如。这是我到现在为止所尝试的。
<?php
function recursive_daily_deals($i = 1) {
$current_date = strtotime(date('d-m-Y h:i:s'));
$dbs_date_1 = strtotime('29-06-2017 8:20:16');
$current_hour = date('h');
var_dump($current_hour);
$products = [
451,
455,
453
];
if ($i < count($products)) {
return recursive_daily_deals($i+1);
}
}
?>
预期输出
> First day - June 29 2017
> It will appear 451
> Second day - June 30 2017
> It will appear 455
> 3rd day - July 1st 2017
> It will appear 453
> 4th Day - July 2nd 2017
> It will appear 453
> And start over
答案 0 :(得分:2)
首先,您需要知道自开始日起已过了多少天。要做到这一点,您只需要从实际时间戳中提取起始时间戳:
$dbs_date_1 = strtotime('29-06-2017 8:20:16');
$actualTimestamp = time();
$elapsedSec = $dbs_date_1 - $actualTimestamp;
// we need to get days from seconds
$elapsedDays = $elapsedSec / (3600*24);
$elapsedDays = floor($elapsedDays);
所以当你从开始的那天起已经有多少天了。我们使用floor()而不是round(),因为如果脚本在一天的一半之后运行,它将返回+1天。
通过这个天数,我们可以通过将经过的天数除以数组中的项目数来获得已经完成的周期数:
$nbItems = count($products);
$cycleCount = $elapsedDays / $nbItems;
$finishedCycles = floor($cycleCount);
我们通过铺设循环次数来存储完成的循环次数。然后我们只需要从经过的天数中完成这些周期所花费的时间,我们将得到指数的位置。
$completeDays = $finishedCycles * $nbItems;
$actualPosition = $elapsedDays - $completeDays;
return $products[$actualPosition];
答案 1 :(得分:1)
虽然这是最初发布的代码的简化版本,但我认为它包含了OP寻求的那种逻辑,如下所示:
<?php
$products = [
451,
455,
453
];
$modfactor = count($products);
$days = null;
$weekdays = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"];
for ($i=0, $max = 7; $i < $max; $i++) {
$days[$i] = $i % $modfactor;
}
foreach ($weekdays as $dex => $wday) {
echo "$wday, ";
echo $products[ $days[$dex] ], "\n";
}
请参阅demo
更新:请参阅demo here,它使用array_map()并获取当前的产品ID。
虽然循环存在,但它不是无限的。如果产品数量发生变化,那么modfactor也会发生变化。一直保持不变的是一周的日子。使代码工作的原因是利用模运算。