Вместо того, чтобы пытаться создать за один раз, что приводит к этому беспорядку
'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 (запись всего дважды) - убийца, потому что невозможно поддерживать код с дублированием.Если вы хотите добавить поле в вас, вам нужно отредактировать и добавить его ко всем этим дубликатам, если вы пропустите одно, вы можете не осознавать, что что-то не так, как надо, и вам придется выбирать все, что вы искали в одном месте, где вы что-то пропустили.
Попробуйте написать СУХОЙ (не повторяющийся) код.Всякий раз, когда я вижу себя пишущим один и тот же код снова и снова, я переосмысливаю его структуру, потому что это основа вашего кода.Нет смысла «ремонтировать» дом, подвал которого разваливается.
ОБНОВЛЕНИЕ
Для первой части вы хотите сделать что-то подобное (я понятия не имею,как выглядят ваши данные, так что я просто их использую)
$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%.Меньше кода, меньше ошибок, меньше вещей, которые нужно разобрать, чтобы исправить и т.д. ...
Нет ничего плохого в том, чтобы дважды зацикливать одни и те же данные, если это делает код более читабельным, что нормально.Даже не делая этого, я вижу способы объединить мои примеры в один.Но читаемость номер 1 в моей книге.Без этого вы никогда не найдете ошибок или не сможете их исправить, потому что вы не можете прочитать код.
Последнее, что я скажу, это спросите себя, что происходит на 6-м ударе, вы обрабатываете только код5. Примеры, которые я показал, обрабатывают любое количество перфораций.Я предполагаю, что это сбросит $counter
в 0 и перезапишет вещи.
Cheers!