繁体   English   中英

php取一个大数组并按日期排序它的时间到一条记录的新记录中,该记录具有与之相关的所有时间的数据

[英]php taking a large array and sorting its times by there dates into new records of one record with data with all the times associated with it

我有一个上班时间的数据库,我需要将它们以某种格式导出到pdf(我可以这样做)。 记录具有单个日期,带有打入和打出时间(以及需要结转的其他数据):

Date     Punch IN     Punch OUT

我需要格式化要导出的数据,以便具有多次打入和打入的任何日期都始终在同一行/记录上。 所以我可以像在pdf中那样导出它:

Date     Punch IN(1)   Punch OUT(1)   Punch IN(2)   Punch OUT(2) (ETC)

我的问题是我使用下面的代码浏览包含所有记录的初始数组,并且导出几乎是正确的,但是由于某种原因,第一个记录被最后一个记录覆盖。 因此,我总是会丢失第一张唱片,显然我需要修正它,但是对于我一生来说,我做不到。

下面的代码创建了新数组,因此我可以将其导出到pdf中(我知道该怎么做)。

$punchpdfexport = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'Total'=> '', 'NotesIN' => '', 'NotesOut' => '']);
  $punchpdfexportprev = null;

  $pdfexportpunch = array();

  $previousrow = '';
  $previouscount = 0;
  $count = 0;
  $length = count($punch);
  $check = 0;

  foreach ($punch as $row){
    if ($previousrow != '' && $previousrow->PunchINDate == $row->PunchINDate){
      $count += 1;
      if(($punchpdfexportprev[0]->IN != '') && $count == 1){
        $punchpdfexporttwo = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'Total'=> '', 'NotesIN' => '', 'NotesOut' => '']);
        $punchpdfexporttwo[0]->Date = $punchpdfexportprev[0]->Date;
        $punchpdfexporttwo[0]->IN = $punchpdfexportprev[0]->IN;
        $punchpdfexporttwo[0]->OUT = $punchpdfexportprev[0]->OUT;
        $punchpdfexporttwo[0]->IN_2 = $row->PunchInTime;
        $punchpdfexporttwo[0]->OUT_2 = $row->PunchOutTime;
        $result = $this->functions->secondssum($row->TotalTime,$punchpdfexportprev[0]->Total);
        $punchpdfexporttwo[0]->Total = $result.":00";
        $punchpdfexporttwo[0]->NotesIN = $punchpdfexportprev[0]->NotesIN . $row->NotesIN;
        $punchpdfexporttwo[0]->NotesOut = $punchpdfexportprev[0]->NotesOut . $row->NotesOut;
        if ($check == $length - 1){
          $pdfexportpunch[$punchpdfexporttwo[0]->Date] = $punchpdfexporttwo;
          break;
        }
      }elseif (($punchpdfexportprev[0]->IN != '') && $count == 2){
        $punchpdfexportthree = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'Total' => '', 'NotesIN' => '', 'NotesOut' => '']);
        $punchpdfexportthree[0]->Date = $punchpdfexporttwo[0]->Date;
        $punchpdfexportthree[0]->IN = $punchpdfexporttwo[0]->IN;
        $punchpdfexportthree[0]->OUT = $punchpdfexporttwo[0]->OUT;
        $punchpdfexportthree[0]->IN_2= $punchpdfexporttwo[0]->IN_2;
        $punchpdfexportthree[0]->OUT_2 = $punchpdfexporttwo[0]->OUT_2;
        $punchpdfexportthree[0]->IN_3 = $row->PunchInTime;
        $punchpdfexportthree[0]->OUT_3 = $row->PunchOutTime;
        $result = $this->functions->secondssum($row->TotalTime,$punchpdfexporttwo[0]->Total);
        $punchpdfexportthree[0]->Total = $result.":00";
        $punchpdfexportthree[0]->NotesIN = $punchpdfexporttwo[0]->NotesIN . $row->NotesIN;
        $punchpdfexportthree[0]->NotesOut = $punchpdfexporttwo[0]->NotesOut . $row->NotesOut;
        if ($check == $length - 1){
          $pdfexportpunch[$punchpdfexportthree[0]->Date] = $punchpdfexportthree;
          break;
        }
      }elseif (($punchpdfexportprev[0]->IN != '') && $count == 3){
        $punchpdfexportfour = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'IN_4' => '', 'OUT_4' => '', 'Total'=> '', 'NotesIN' => '', 'NotesOut' => '']);
        $punchpdfexportfour[0]->Date = $punchpdfexportthree[0]->Date;
        $punchpdfexportfour[0]->IN = $punchpdfexportthree[0]->IN;
        $punchpdfexportfour[0]->OUT = $punchpdfexportthree[0]->OUT;
        $punchpdfexportfour[0]->IN_2= $punchpdfexportthree[0]->IN_2;
        $punchpdfexportfour[0]->OUT_2 = $punchpdfexportthree[0]->OUT_2;
        $punchpdfexportfour[0]->IN_3= $punchpdfexportthree[0]->IN_3;
        $punchpdfexportfour[0]->OUT_3 = $punchpdfexportthree[0]->OUT_3;
        $punchpdfexportfour[0]->IN_4 = $row->PunchInTime;
        $punchpdfexportfour[0]->OUT_4 = $row->PunchOutTime;
        $result = $this->functions->secondssum($row->TotalTime,$punchpdfexportthree[0]->Total);
        $punchpdfexportfour[0]->Total = $result.":00";
        $punchpdfexportfour[0]->NotesIN = $punchpdfexportthree[0]->NotesIN . $row->NotesIN;
        $punchpdfexportfour[0]->NotesOut = $punchpdfexportthree[0]->NotesOut . $row->NotesOut;
        if ($check == $length - 1){
          $pdfexportpunch[$punchpdfexportfour[0]->Date] = $punchpdfexportfour;
          break;
        }
      }elseif (($punchpdfexportprev[0]->IN != '') && $count == 4){
        $punchpdfexportfive = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'IN_4' => '', 'OUT_4' => '', 'IN_5' => '', 'OUT_5' => '', 'Total' => '', 'NotesIN' => '', 'NotesOut' => '']);
        $punchpdfexportfive[0]->Date = $punchpdfexportfour[0]->Date;
        $punchpdfexportfive[0]->IN = $punchpdfexportfour[0]->IN;
        $punchpdfexportfive[0]->OUT = $punchpdfexportfour[0]->OUT;
        $punchpdfexportfive[0]->IN_2= $punchpdfexportfour[0]->IN_2;
        $punchpdfexportfive[0]->OUT_2 = $punchpdfexportfour[0]->OUT_2;
        $punchpdfexportfive[0]->IN_3= $punchpdfexportfour[0]->IN_3;
        $punchpdfexportfive[0]->OUT_3 = $punchpdfexportfour[0]->OUT_3;
        $punchpdfexportfive[0]->IN_4= $punchpdfexportfour[0]->IN_4;
        $punchpdfexportfive[0]->OUT_4 = $punchpdfexportfour[0]->OUT_4;
        $punchpdfexportfive[0]->IN_5 = $row->PunchInTime;
        $punchpdfexportfive[0]->OUT_5 = $row->PunchOutTime;
        $result = $this->functions->secondssum($row->TotalTime,$punchpdfexportfour[0]->Total);
        $punchpdfexportfive[0]->Total = $result.":00";
        $punchpdfexportfive[0]->NotesIN = $punchpdfexportfour[0]->NotesIN . $row->NotesIN;
        $punchpdfexportfive[0]->NotesOut = $punchpdfexportfour[0]->NotesOut . $row->NotesOut;
        if ($check == $length - 1){
          $pdfexportpunch[$punchpdfexportfive[0]->Date] = $punchpdfexportfive;
          break;
        }
      }
    }else{
      if ($previouscount < $count){
        $previouscount = $count;
      }else{

      }
      if ($count == 0 && $punchpdfexportprev != null){
        $pdfexportpunch[$punchpdfexport[0]->Date] = $punchpdfexport;
      }elseif ($count == 1 && $check != $length - 1){
        $pdfexportpunch[$punchpdfexporttwo[0]->Date] = $punchpdfexporttwo;
      }elseif ($count == 2 && $check != $length - 1){
        $pdfexportpunch[$punchpdfexportthree[0]->Date] = $punchpdfexportthree;
      }elseif ($count == 3 && $check != $length - 1){
        $pdfexportpunch[$punchpdfexportfour[0]->Date] = $punchpdfexportfour;
      }elseif ($count == 4 && $check != $length - 1){
        $pdfexportpunch[$punchpdfexportfive[0]->Date] = $punchpdfexportfive;
      }
      $count = 0;
    }
    if ($count == 0){
      $punchpdfexport[0]->Date = $row->PunchINDate;
      $punchpdfexport[0]->IN = $row->PunchInTime;
      $punchpdfexport[0]->OUT = $row->PunchOutTime;
      $punchpdfexport[0]->Total = $row->TotalTime;
      $punchpdfexport[0]->NotesIN = $row->NotesIN;
      $punchpdfexport[0]->NotesOut = $row->NotesOut;
    }
    if ($previouscount < $count){
      $previouscount = $count;
    }else{

    }
    $previousrow = $row;
    $punchpdfexportprev = $punchpdfexport;
    $check++;
  }
  var_dump($pdfexportpunch);

我在末尾使用var_dump来查看foreach循环的结果,如下所示:

 array (size=4)
  '2018-08-22' => 
array (size=1)
  0 => 
    object(stdClass)[50]
      public 'Date' => string '2018-08-30' (length=10)
      public 'IN' => string '08:49:52' (length=8)
      public 'OUT' => string '09:29:01' (length=8)
      public 'Total' => string '00:45:00' (length=8)
      public 'NotesIN' => string 'testing 1 2 3' (length=13)
      public 'NotesOut' => string '' (length=0)
  '2018-08-28' => 
array (size=1)
  0 => 
    object(stdClass)[51]
      public 'Date' => string '2018-08-28' (length=10)
      public 'IN' => string '06:13:07' (length=8)
      public 'OUT' => string '13:15:16' (length=8)
      public 'IN_2' => string '05:05:44' (length=8)
      public 'OUT_2' => string '09:54:03' (length=8)
      public 'Total' => string '11:45:00' (length=8)
      public 'NotesIN' => string 'theuhd gdhsjfsdh dfsdhsdjsdg dsdhsd fdsdjsdhj, dgshsgd djssd djsdbsd djdsfsd dfjsdfn. dudhsdsdjj. ffjjdnds dfjfdfd.' (length=115)
      public 'NotesOut' => string '' (length=0)
  '2018-08-29' => 
array (size=1)
  0 => 
    object(stdClass)[52]
      public 'Date' => string '2018-08-29' (length=10)
      public 'IN' => string '08:04:26' (length=8)
      public 'OUT' => string '11:07:24' (length=8)
      public 'IN_2' => string '11:10:33' (length=8)
      public 'OUT_2' => string '13:09:16' (length=8)
      public 'Total' => string '05:00:00' (length=8)
      public 'NotesIN' => string 'hfgftesting again' (length=17)
      public 'NotesOut' => string 'testdgtesting later' (length=19)
  '2018-08-30' => 
array (size=1)
  0 => 
    object(stdClass)[56]
      public 'Date' => string '2018-08-30' (length=10)
      public 'IN' => string '08:49:52' (length=8)
      public 'OUT' => string '09:29:01' (length=8)
      public 'IN_2' => string '09:32:16' (length=8)
      public 'OUT_2' => string '11:21:19' (length=8)
      public 'IN_3' => string '11:21:22' (length=8)
      public 'OUT_3' => string '12:24:36' (length=8)
      public 'IN_4' => string '13:52:47' (length=8)
      public 'OUT_4' => string '15:08:54' (length=8)
      public 'IN_5' => string '12:59:10' (length=8)
      public 'OUT_5' => string '13:52:19' (length=8)
      public 'Total' => string '05:45:00' (length=8)
      public 'NotesIN' => string 'testing 1 2 3hello there' (length=24)
      public 'NotesOut' => string '' (length=0)

那里的第一条记录应该与它的关键2018-08-22相同,但是相反,它被最后一个2018-08-30所覆盖,我不知道为什么,除非它是内置函数问题。 否则,其他3条记录是完美的,并且可以按预期工作。

如您所见,我尝试使用日期作为键将新的数组对象插入到数组中,这样就不会发生覆盖问题。

我希望这只是一个简单的重写,以便能够工作,如果有更好的解决方法,请让我知道我想像有,但是在使用array_push,array_merge,array_merge_recursive之类的方法搜索之后,给出了同样的问题或更糟。

而不是一劳永逸地构建,这会导致混乱

'2018-08-30' => 
array (size=1)
  0 => 
    object(stdClass)[56]
      public 'Date' => string '2018-08-30' (length=10)
      public 'IN' => string '08:49:52' (length=8)
      public 'OUT' => string '09:29:01' (length=8)
      public 'IN_2' => string '09:32:16' (length=8)
      public 'OUT_2' => string '11:21:19' (length=8)
      public 'IN_3' => string '11:21:22' (length=8)
      public 'OUT_3' => string '12:24:36' (length=8)
      public 'IN_4' => string '13:52:47' (length=8)
      public 'OUT_4' => string '15:08:54' (length=8)
      public 'IN_5' => string '12:59:10' (length=8)
      public 'OUT_5' => string '13:52:19' (length=8)
      public 'Total' => string '05:45:00' (length=8)
      public 'NotesIN' => string 'testing 1 2 3hello there' (length=24)
      public 'NotesOut' => string '' (length=0)

将数据分组为以下结构:

    [ 
       '2018-08-30' => [
          'Date' => '2018-08-30',
          'Punches' => [ 
            ['IN' => '08:49:52', 'OUT' => '09:29:01'],
            ['IN' => '09:32:16', 'OUT' => '11:21:19'],
            ['IN' => '11:21:22', 'OUT' => '12:24:36']
          ],
          'Total' => '05:45:00'
          'NotesIN' => 'testing 1 2 3hello there'
          'NotesOut' => ''
       ],
     ....
     ]

然后重新处理并构建您的对象。 这样做会容易得多

  foreach($Punches as $key=>$punch){
      $postfix = empty($key) ? "" : "_$key";

       $obj->{"IN{$postfix}"} = $punch["IN"];
       $obj->{"OUT{$postfix}"} = $punch["OUT"]; 
 }

要将它们添加到对象中,这还应允许您删除所有重复的代码,例如查看以下内容:

if(($punchpdfexportprev[0]->IN != '') && $count == 1){
    $punchpdfexporttwo = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'Total'=> '', 'NotesIN' => '', 'NotesOut' => '']);
    $punchpdfexporttwo[0]->Date = $punchpdfexportprev[0]->Date;
    ...
}elseif (($punchpdfexportprev[0]->IN != '') && $count == 2){
    $punchpdfexportthree = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'Total' => '', 'NotesIN' => '', 'NotesOut' => '']);
    $punchpdfexportthree[0]->Date = $punchpdfexporttwo[0]->Date;   
    ...  
}elseif (($punchpdfexportprev[0]->IN != '') && $count == 3){
    $punchpdfexportfour = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'IN_4' => '', 'OUT_4' => '', 'Total'=> '', 'NotesIN' => '', 'NotesOut' => '']);
    $punchpdfexportfour[0]->Date = $punchpdfexportthree[0]->Date;
    ...
}elseif (($punchpdfexportprev[0]->IN != '') && $count == 4){
    $punchpdfexportfive = array((object)['Date' => '', 'IN' => '', 'OUT' => '', 'IN_2' => '', 'OUT_2' => '', 'IN_3' => '', 'OUT_3' => '', 'IN_4' => '', 'OUT_4' => '', 'IN_5' => '', 'OUT_5' => '', 'Total' => '', 'NotesIN' => '', 'NotesOut' => '']);
    $punchpdfexportfive[0]->Date = $punchpdfexportfour[0]->Date;
    ....
}else{

除了要放入变量的名称外,所有这些都重复了。对于我来说,要想出一个完整的解决方案而又没有原始数据集可以使用,对我来说太过分了。

但希望有帮助。

我知道,请相信我我也不喜欢它,但是我打算在工作后对其进行简化。

很好,但这就是注释的目的,只需注释掉旧代码,然后从新代码开始。 问题在于,从根本上来说这是有缺陷的,因为您所需的结构不存在。 因此,要修复此问题,您将可以用任何方式对其进行重写。

复制或WET(两次写入所有内容)是一个杀手,因为它不可能维护具有重复的代码。 如果您想在其中添加一个字段,则必须对其进行编辑并将其添加到所有重复的内容中,如果您错过了某个字段,您可能不会意识到某些错误的正确方法,因此必须遍历所有寻找您错过了某个内容的位置。

尝试编写DRY(请勿重复自己)代码。 每当我发现自己一遍又一遍地编写相同的代码时,我都会重新考虑它的结构,因为那是您代码的基础。 固定地下室正在坍塌的房屋毫无意义。

UPDATE

对于第一部分,您想要做这样的事情(我不知道您的数据是什么样的,所以我只介绍它)

     $data = [];
     foreach ($punch as $row){
        $key = $row['date'];
        if(!isset($data[$key])){
           $data[$key] = [
              'Date' => $row['date'],
              'Punches' => [],
              'Total' => 0
              'NotesIN' => ''
              'NotesOut' => ''
           ];
        }

        $data[$key]['Punches'][] = [
            'IN' => $row['IN']
            'OUT' => $row['OUT']
        ];
        $data[$key]['Total'] += $row['Total'];
        $data[$key]['NotesIN'] .= ' '.$row['NotesIN'];
        $data[$key]['NotesOUT'] .= ' '.$row['NotesOUT'];
     }

然后,在$data上循环并从中创建对象。 您可以将代码减少约80%。 更少的代码,更少的错误,更少的可修复问题,等等。

如果可以使代码更具可读性,那么遍历相同的数据两次就没有错。 即使没有这样做,我也看到了将示例组合成一个示例的方法。 但是可读性是我书中的第一位。 没有它,您将永远找不到错误或无法修复它们,因为您无法阅读代码。

我要说的最后一件事是问自己第六次打孔发生了什么,您只编写了句柄5。我展示的示例可以处理任意数量的打孔。 我的猜测是,这会将$counter重置$counter 0并覆盖内容。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM