[英]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.