php берет большой массив и сортирует его время по датам в новые записи одной записи с данными со временем, связанным с ним - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть база данных ударов в разы, мне нужно экспортировать их в 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 и как и у того же вопроса или хуже.

1 Ответ

0 голосов
/ 09 сентября 2018

Вместо того, чтобы пытаться создать за один раз, что приводит к этому беспорядку

'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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...