【发布时间】:2015-09-08 04:45:56
【问题描述】:
这里是我正在尝试创建的一些背景。
我正在创建一个名为getNextBilling($dateStart,$dateCount = 20)的函数
您给它一个周期长度,即您希望某人被计费的天数
$test->period = '2,5,15';
它需要一个开始日期 我已经在测试页面上分配了
$test->getNextBilling('2015-06-12 00:00:00',2);
该功能应该做的是确保输入的日期小于当前日期以跳过本月计费,这非常有效。
什么不起作用是我的 while 循环中有一个 foreach 循环来查看输入的所有天数,我找不到让代码在实际只显示天数的地方工作的方法你想要的。
上面的例子显示我想显示 2 天的输出是
Array
(
[1] => 2015-06-15
[2] => 2015-07-02
[3] => 2015-07-05
[4] => 2015-07-15
)
这是函数的代码
// SET START DATE
$startDate = new DateTime($dateStart);
// LOOP
$i = 1;
while($i <= $dateCount){
// LOOP THROUGH INPUTED DAYS
foreach($days as $day){
// CLEAN DAY
$day = formatNumbersOnly($day);
// SET LAST DAY
$lastDay = new DateTime($startDate->format('Y-m-d'));
$lastDay->modify('last day of this month');
// CHECK FOR PASSED DAY
if($day > $startDate->format('j')){
// CHECK FOR 28-29-30-31
if($day > $lastDay->format('j')){
// SET NEW DATE
$startDate->setDate(
$startDate->format('Y'),
$startDate->format('m'),
$lastDay->format('j')
);
} else {
// SET NEW DATE
$startDate->setDate(
$startDate->format('Y'),
$startDate->format('m'),
$day
);
}
// SET ARRAY
$nextBilling[$i] = $startDate->format('Y-m-d');
} else {
// SKIP
$i--;
}
// INCREASE COUNT
$i++;
}
// NEXT MONTH
$startDate->modify('1 month');
$startDate->setDate($startDate->format('Y'),$startDate->format('m'),1);
}
现在我明白问题出在哪里了,这是因为 foreach 循环内的计数增加了,但是当我把它放在外面时,它只会输出最后一天,就像这样:
Array
(
[-1] => 2015-06-15
[0] => 2015-07-15
[1] => 2015-08-15
[2] => 2015-09-15
)
如果有人有任何批评或提示,将不胜感激。我将继续尝试修复它。
编辑:我在foreach 的开头添加了一个if 语句来检查$i 是否大于$dateCount 它会跳出循环。感谢 Twisty 的时间和努力,我很感激。
【问题讨论】:
-
在您的示例中,我看不到您的
foreach循环在哪里关闭。 -
foreach 在
// INCREASE COUNT $i++;之后关闭 -
$days定义在哪里? -
对不起,我忘了补充,
// EXPLODE CONTENTS TO FIND DAYS $days = explode(',', $this->period); -
$days中预期的值是多少?
标签: php loops foreach while-loop