PHP访问存储在数组中的对象

时间:2011-11-15 00:28:24

标签: php

我是新手采用面向对象的方法用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

}

2 个答案:

答案 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.
}

请注意,如果数组包含奇数个元素,则上述操作将失败 - 我会将该修复保留给您(如果您需要)。

Demo

编辑:由于以下两个原因之一,您可能会收到该错误:

  1. 您正在引用一个不是DateTime对象的元素
  2. 您正在引用日期数组中不存在的元素
  3. 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.');
      }
    }
    

    See it in action.

答案 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>';
        }