我是新手采用面向对象的方法用PHP ...实际上我有很多学习要做的整体,但唯一的学习方法是做。
所以我有一个包含几个DateTime对象的数组。我知道这是真的,因为我在数组上运行了var_dump,它确实存放了几个对象。
我需要经历每个日期,并确保永远不会有超过一天的差异。
我的研究似乎表明我们无法使用下标运算符访问或修改对象:
$foo = $neat_array[$i+1]->format('U') ; //looking to format DateTime object as unix
//this returns an error every time
好吧我很好,但我根本无法弄清楚访问数组中特定项目的语法,以便它被视为一个对象并且不会引发错误。
我已拼凑使用 - >是我需要做的,但我从来没有得到任何可用的结果。
以下是我正在尝试做的伪代码
foreach($date_array as $date)
{
//check to see if the difference between the next date in the array and the current date of the array is greater than one day.
//I cannot use diff because I am on php 5.2 so I am trying this
$date->format('U') and then doing the math
}
答案 0 :(得分:1)
由于通过实验(和失败)学习是IMO学习的好方法,所以这里有一些东西可以帮助你开始。
$date_array = array(
new DateTime("tomorrow"),
new DateTime("now"),
new DateTime("yesterday"),
new DateTime("last day of october")
);
for( $i = 0, $count = count( $date_array); $i < $count; $i += 2) {
// Get the current object AND the next one in the array
echo $date_array[ $i ]->format('U'); echo '<br />';
echo $date_array[ $i + 1 ]->format('U'); echo '<br />';
// Now that you have the UNIX timestamps, you can do the math you need in here.
}
请注意,如果数组包含奇数个元素,则上述操作将失败 - 我会将该修复保留给您(如果您需要)。
编辑:由于以下两个原因之一,您可能会收到该错误:
Here is a demo显示错误#2。
编辑:这是一个基于您的答案的工作示例,适用于偶数和奇数数组。它基本上是相同的,除了我没有把值保存到变量或减去和比较为1(因为它是不必要的)。
$session_dates = $date_array = array(
new DateTime("tomorrow"),
new DateTime("yesterday"),
new DateTime("now"),
);
for( $i = 0, $count = count( $date_array) - 1; $i < $count; $i++)
{
if( ($date_array[ $i + 1 ]->format('U') - $date_array[ $i ]->format('U')) > 86400)
{
die( 'The date array does not contain consecutive dates.');
}
}
答案 1 :(得分:0)
好的......首先,我感谢大家的帮助。尼克,谢谢你的帮助和演示。正如我之前推测的那样,你可能试图访问数组中不存在的元素的建议绝对是这样的。我在这里尝试做的是我正在创建的网站中非常重要的一部分..这一整个混乱将作为检查预订日期的类中的函数。
这是我在Stack Overflow的第一次拍摄,所以请原谅我,但我可能应该在我最初的问题中提供更多信息,但我确信我知道为什么代码不能正常工作......这完全是错误的!
请参阅,因为我总是需要知道当前元素,加上数组中的下一个元素,我的代码总是在循环的最后一次运行中断开,因为它试图访问当前键,加上下一个一个(在最后一次尝试中不存在)。
现在,真正令人沮丧的部分是我整夜用这个代码的for循环搞砸了我仍然无法干净地完成每个项目而不会破坏...我总是会在最后一项上超过的数组并拉出错误。我认为问题一直是我从来没有需要遍历数组中的每个项目,只是到倒数第二个项目(加上检查下一个项目)然后退出循环。
这是我的代码最终有效,但我真的不喜欢它...我觉得在语法和其他方面有一些简单的修复可以使这更有效...如果没有,那么是吧......顺便说一句,基本上我的测试代码充满了回声,看看实际发生了什么,但它终于做好了一切:
$count = (count($session_dates)-1);
//never could get that last item to not trigger error, so subtracting one from the count was the only thing to end my frustration!!!but as I write this answer I think I see why and that is because we don't need to go through each item of the array, just each but the last item
echo '<p>'.$count.' this is the count of session dates </p>';
for ($i=0; $i<$count; $i++){
$unix_one = $session_dates[$i+1]->format('U');
//make some variables that are in the date format I want to visualize for echoing
$unix_echo_one = $session_dates[$i+1]->format("n".'/'."j".'/'."Y");
$unix_two = $session_dates[$i]->format('U');
$unix_echo_two = $session_dates[$i]->format("n".'/'."j".'/'."Y");
//see if the difference is greater than one day
if(($unix_one-$unix_two)/86400>1){
echo 'these dates are absolutely not consecutive, you fail!!';
//we only need one occurrence to wreck what we are trying to do, so just exit if it happens.
exit();
}
//I needed to see if any of the loop was happening to help try and figure this out!!
echo '<p>'.$unix_echo_one.'||'.$i.'||'.$unix_echo_two.'</p>';
}