Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php foreach循环中比较元素时未定义的偏移量_Php_Arrays - Fatal编程技术网

Php foreach循环中比较元素时未定义的偏移量

Php foreach循环中比较元素时未定义的偏移量,php,arrays,Php,Arrays,嗨,我想用foreach循环比较两个元素的日期。每当它们匹配时,将它们添加到一个数组中,并将该数组推送到另一个数组中 这样做的想法是,我将在一个表中显示所有元素,匹配的元素日期将其日期列分组为colspan=n。使用辅助数组,我将能够使用该数组的长度作为colspan数量 $elements = array(); $ts_index = 0; foreach($timesheetweeks as $timesheetweek){ $arr = array(); foreach(

嗨,我想用foreach循环比较两个元素的日期。每当它们匹配时,将它们添加到一个数组中,并将该数组推送到另一个数组中

这样做的想法是,我将在一个表中显示所有元素,匹配的元素日期将其日期列分组为colspan=n。使用辅助数组,我将能够使用该数组的长度作为colspan数量

$elements = array();
$ts_index = 0;

foreach($timesheetweeks as $timesheetweek){
    $arr = array();
    foreach($timesheetweek->timesheets as $index => $timesheet){

        $this_date = $timesheetweek->timesheets[$index]->start_date;
        $next_date = $timesheetweek->timesheets[$index + 1]->start_date;

        if($this_date == $next_date){
            $elements[$ts_index][] = $timesheetweek->timesheets[$index + 1];
        } else {
            $elements[$ts_index] = $timesheetweek->timesheets[$index];
            $ts_index += 1;
        }
    }
} 
不幸的是,在经历了一些头痛和输给阿根廷的比赛后,我犯了以下错误:

未定义偏移量:4

仅供参考:这是我努力实现的目标:

elements [
    1 => element1, //diff date
    2 => array( //same date array
        element2,
        element3
    ),
    3 => element4 //diff date
]   

当$index达到其最大值$index=count$timesheetweek->timesheets-1;时,$timesheetweek->timesheets[$index+1]项不存在

对某些代码并不完全确定,但这一总体思路应该会有所帮助:

$elements = array();
$ts_index = -1;
$currentDate = '';    

foreach ($timesheetweeks as $timesheetweek) {

    foreach ($timesheetweek->timesheets as $index => $timesheet) {

      if ($timesheet->start_date != $currentDate) {

        // check to see if the last $elements element had just one entry, if so flatten it
        if ($ts_index > -1 && count($elements[$ts_index]) == 1) {
          $elements[$ts_index] = $elements[$ts_index][0];
        }

        $currentDate = $timesheet->start_date;
        $ts_index++;

        // create a new array to store this timesheet and any more that may have the same start_date
        $elements[$ts_index] = array();
      }

      $elements[$ts_index][] = $timesheet;

    }
}

// if the last element we added is an array with 1 item, flatten it
if ($ts_index > -1 && count($elements[$ts_index]) == 1) {
   $elements[$ts_index] = $elements[$ts_index][0];
}

因为你的$index+1。当它到达最后一个元素时,它仍然在寻找下一个元素。你最好还是用一个loop@ElefantPhace:正如我所想并回答猎户座一样,谢谢你的回答!嘿,詹姆斯,谢谢你的回复。但是我没有得到$elements[$ts_index]=数组;部分这对我来说没什么意义。我编辑了我的页面以涵盖嵌套数组的实际含义。我已经更新了我的答案。因为我们只处理循环中的当前时间表,所以我们还不知道稍后循环中是否会有多个具有相同日期的时间表。为了安全起见,我们将$elements[$ts_index]的每个成员都设置为一个数组,在处理完当前开始日期后,我们可以检查该数组中是否只有一个元素,如果只有,则将其展平。不幸的是,这将设置主数组中的所有元素。我正在尝试调试,看看故障在哪里。我真的很抱歉,我刚刚发现了我的错误,它现在可以工作了。我完全忘记了日期实际上是一个碳物体。我只需要调用->toDateTimeString,它就工作了。。。我很抱歉^^^啊,这是一个边界外的错误:D这是有意义的。但我如何实施这项检查?现在真的不是我的日子。所以我假设使用$index=count$timesheetweek->timesheets-1;如您所建议的,并将if/else闭包置于两者之间?您可以添加一个条件以确保此项存在。例如,如果$indextimesheets-1。