Возникают проблемы, когда я не могу понять, как написать конкретный цикл - PullRequest
0 голосов
/ 26 февраля 2020

Я запрашиваю базу данных SQL для возврата открытых операций рабочего задания.
Мой запрос производит номер рабочего заказа, статус операции и срок выполнения.
Я пытаюсь выяснить, как выполнить итерацию по возвращаемый массив и:

  • Соберите сумму операций, подлежащих оплате в течение недели
  • Соберите сумму операций, подлежащих оплате на второй неделе
  • Продолжайте делать это пока я не выполню все записи, продолжающиеся столько недель, сколько необходимо.

Мой SQL запрос выглядит примерно так:

SELECT * FROM OPERATION WHERE RESOURCE_ID = '280LASERS' ORDER BY DUE_DATE;

Он будет возвращать что-то как:

W/O #   | Setup Hours  |  Run Hours  |  Due Date
W159769 |     0.5      |    15.0     | 03/01/2020
W159770 |     1.5      |     9.0     | 04/01/2020
W159771 |     0.75     |    81.0     | 05/01/2020

В любом случае, я пытаюсь выполнить sh запрос базы данных, просмотреть мой результат и получить сумму за неделю.
Пока СЕЙЧАС + 7 дней <= DUE_DATE; В то время как сейчас + 14 дней <= DUE_DATE ... </p>

Неделя первая = 15,5 часов; Вторая неделя = 10,5 часов; Неделя третья = 81,75 часа

РЕДАКТИРОВАТЬ: Я прошу прощения за мой беспорядок вопрос, это одна из самых интенсивных задач, которые я пытался выполнить sh с SQL и PHP.

Мы пытаемся лучше справиться с нашими возможностями и сообщаем о наших возможностях.
Я надеюсь, что смогу выполнить запрос, который выполняет все операции «280LASERS» и что-то вроде root значение (как сегодняшняя дата) для сравнения DUE_DATE с.

Мой план состоит в том, чтобы сортировать по DUE_DATE и получать SUM (SETUP_HRS + RUN_HRS), пока DUE_DATE не станет больше (TODAY () + 7) затем получайте SUM (SETUP_HRS + RUN_HRS) до тех пор, пока DUE_DATE не станет больше, чем (TODAY () + 14), а затем ...

Я не могу добиться этого с переменными stati c, поскольку количество недель может go от 6 недель до более 30 недель, просто в зависимости от DUE_DATE самого дальнего ордера.

Я так близко, что могу попробовать, я действительно хотел бы поделиться своим кодом, и вывод ... но чувствую, что я взорвал эту страницу, и это горячий беспорядок. Было бы приемлемо, чтобы я удалил все вышеперечисленное и опубликовал свой код как есть, а также вывод, который я получаю.

Ответы [ 5 ]

2 голосов
/ 27 февраля 2020

Я не думаю, что вам нужно oop. Похоже, вы могли бы просто рассчитать номер недели, сгруппировать по нему и суммировать часы недели.

MySQL

select
  DATEDIFF(due_date, NOW()) DIV 7 + 1 AS week_number,
  SUM(setup_hours + run_hours) AS week_hours
from operation
where resource_id = '280LASERS'
group by week_number;

SQL Сервер

select
  DATEDIFF(wk, getdate(), due_date) AS week_number,
  SUM(setup_hours + run_hours) AS week_hours
from operation
where resource_id = '280LASERS'
group by DATEDIFF(wk, getdate(), due_date);
1 голос
/ 28 февраля 2020

так что я вернулся, я добавлю лучший закомментированный код, здесь: не могу редактировать старый ответ, так как я удалил свою учетную запись и забыл отменить: |

В любом случае, вы спросили, как манипулировать данными. Это простой массив, и все внутренние массивы являются суммами от начала недели до конца. Теперь вы можете хранить их с разными ключами, я просто использовал назначение по умолчанию из-за простоты.

<code>$results=array(
  array( 'due_date'=>'12/02/2020', 'run_hours'=>12.4, 'setup_hours'=>2.4, ),   //  2020-02-12 00:00:00
  array( 'due_date'=>'15/02/2020', 'run_hours'=>10.4, 'setup_hours'=>1.4, ),   //  2020-02-15 00:00:00
  array( 'due_date'=>'18/02/2020', 'run_hours'=>8.4, 'setup_hours'=>3.4, ),    //  2020-02-18 00:00:00
  array( 'due_date'=>'20/02/2020', 'run_hours'=>2.4, 'setup_hours'=>1.4, ),    //  2020-02-20 00:00:00
  array( 'due_date'=>'21/02/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),    //  2020-02-21 00:00:00
  array( 'due_date'=>'24/02/2020', 'run_hours'=>12.4, 'setup_hours'=>1.4, ),   //  2020-02-24 00:00:00
  array( 'due_date'=>'26/02/2020', 'run_hours'=>11.3, 'setup_hours'=>1.4, ),   //  2020-02-26 00:00:00
  array( 'due_date'=>'29/02/2020', 'run_hours'=>4.4, 'setup_hours'=>2.4, ),    //  2020-02-29 00:00:00
  array( 'due_date'=>'02/03/2020', 'run_hours'=>5.7, 'setup_hours'=>4, ),      //  2020-03-02 00:00:00
  array( 'due_date'=>'04/03/2020', 'run_hours'=>11.5, 'setup_hours'=>3.4, ),   //  2020-03-04 00:00:00
  array( 'due_date'=>'06/03/2020', 'run_hours'=>7.3, 'setup_hours'=>1.4, ),    //  2020-03-06 00:00:00
  array( 'due_date'=>'08/03/2020', 'run_hours'=>9.6, 'setup_hours'=>1.4, ),    //  2020-03-08 00:00:00
  array( 'due_date'=>'12/03/2020', 'run_hours'=>14.7, 'setup_hours'=>1.4, ),   //  2020-03-12 00:00:00
  array( 'due_date'=>'15/03/2020', 'run_hours'=>12.5, 'setup_hours'=>1.4, ),   //  2020-03-15 00:00:00
  array( 'due_date'=>'19/03/2020', 'run_hours'=>4.4, 'setup_hours'=>1.4, ),    //  2020-03-19 00:00:00
  array( 'due_date'=>'21/03/2020', 'run_hours'=>5.6, 'setup_hours'=>4, ),      //  2020-03-21 00:00:00
  array( 'due_date'=>'24/03/2020', 'run_hours'=>11.4, 'setup_hours'=>1.4, ),   //  2020-03-24 00:00:00
  array( 'due_date'=>'29/03/2020', 'run_hours'=>7.4, 'setup_hours'=>1.4, ),    //  2020-03-29 00:00:00
  array( 'due_date'=>'01/04/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),    //  2020-04-01 00:00:00

  // some far off weeks
  array( 'due_date'=>'18/06/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),
  array( 'due_date'=>'21/06/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),
  array( 'due_date'=>'09/07/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),
  array( 'due_date'=>'12/08/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ),


);
$time=strtotime(date('Y-m-d')); // get time in same
// wrapping time in strtotime and date trims the seconds to the desired format

$one_week=60*60*24*7;
$sums=array();
foreach($results as $row){
/* php 5.3+ this block of code gets the time of the date, this conversions are made in case a custom non standard date format is made, alternatively one can use strtotime with the correct date format

 $date = DateTime::createFromFormat('d/m/Y', $row['due_date']);//use your format and values
 if(!$date){
  echo 'Not a valid format';
  break;
 }
 $entry_time = strtotime(date('Y-m-d',$date->getTimestamp()));
 // if your date format doesnt have hours minutes and seconds then timestamp will add the current h,min,s,
 // this may not be desired, so this wrapping it in strtotime and date trims the values
*/
 // WARNING:  If the format is right weeks will be way off
 $entry_time = strtotime($row['due_date']); // if due_date is a valid format, see PHP docs for more information
 if (!$entry_time) {
   echo "Not a valid date format";
   break;
 }
 $entry_work_hours=$row['run_hours']+$row['setup_hours'];
 // if the entry time is by some reason smaller then the current time save it to a special past_due container
 if ($entry_time < $time) {
   // if a past_due container exists add the sum, otherwise create a past_due container
   if (isset($sums['past_due'])) {
     $sums['past_due']['sum']+=$entry_work_hours;
   } else {
     $sums['past_due']= array(
      'sum'   => $entry_work_hours,
      'start' => $row['due_date'], // the earliest event
      'end'   => date('d/m/Y',$time), // current time, if $entry_time is bigger or equal we're talking about entries that are yet to happen
     );
   }
 } else if ( $entry_time >= $time ){
   // getting the future_dues array, every object holds an array/map, that holds the sum, the start of the week and when the week ends
   // endings are exclusive ie. if an entry_data falls on the end date it goes to the start of the next container
   if (isset($sums['future_dues'])) {
     $future_dues=$sums['future_dues'];
   } else {
     $future_dues = array(
       array(
         'sum'   => 0,
         'start' => $time,
         'end'   => $time+$one_week
       )
     );
   }
   // get the last week container, and save the key so we can reassign it back to the $sums array on the right spot
   $last_index = count($future_dues)-1;
   $future_due = $future_dues[$last_index];

   // manipulate the week data
   // if the entry time is smaller then the current end of the week add to the sum, otherwise add a new week interval container
   if ($entry_time < $future_due['end']) {
     $future_due['sum']+=$entry_work_hours;
     // reassign week container
     $future_dues[$last_index]=$future_due;
   } else {
     $last_week_end = $future_due['end'];
     $new_end       = $last_week_end + $one_week;

     //do a while loop to get the next week end in which the work is done
     while ($new_end < $entry_time) {
       // skip this part if empty weeks are not desired
       $future_dues[] = array(
         'sum'   => 0,
         'start' => $last_week_end,
         'end'   => $new_end
       );
       $last_week_end = $new_end;
       $new_end       = $new_end + $one_week;
       // echo "$new_end < $entry_time".'<br>';
     }

     // add a new week container, the start of the week is the end of the previous one and the end is 7 days from that
     $future_dues[]=array(
       'sum'   => $entry_work_hours,
       'start' => $last_week_end,
       'end'   => $new_end
     );
   }
   // reassign the whole week containers container to the array
   $sums['future_dues']=$future_dues;
 }
}
// convert time back to dates
foreach ($sums['future_dues'] as $key => &$due) {
  $due['start']=date('d/m/Y',$due['start']);
  $due['end']=date('d/m/Y',$due['end']);
}

// use $sums to display the values you need, use:
// echo "<pre>";
// print_r($sums);
// echo "
"; //, чтобы лучше понять, как хранятся данные echo"
"; // use pre tags to have a nice inline values, this can be rewriten into a table
$past_due=$sums['past_due'];
//past due is a single container
$time_prefix="Time: ";
$working_hours_prefix="Working hours: ";

$time = $time_prefix.$sums['past_due']['start']." - ".$sums['past_due']['end'];
echo $time."<br>";
echo $working_hours_prefix.str_pad($sums['past_due']['sum'],abs(strlen($time)-strlen($working_hours_prefix)),' ',STR_PAD_LEFT);
// make it inline with the time
echo "<br><br>";

$due_dates=$sums['future_dues'];
foreach($due_dates as $week_container){
  $time = $time_prefix.$week_container['start']." - ".$week_container['end'];
  echo $time."<br>";
  echo $working_hours_prefix.str_pad($week_container['sum'],abs(strlen($time)-strlen($working_hours_prefix)),' ',STR_PAD_LEFT);
  echo "<br><br>";

  //echo $week_container['sum'];      /// if you want to show the sum
  //echo $week_container['start'];    /// if you want to show the start
  //echo $week_container['end'];      /// if you want to show the end
}
echo "
"; // выше немного абстрагировано, но это обязательно делает это эхо "

"; эхо "

"; $ past_due = $ sums ['past_due']; $ past_start = $ sums ['past_due'] ['start ']; $ past_end = $ sums [' past_due '] [' end ']; $ past_sum = $ sums [' past_due '] [' sum ']; echo "Время: $ past_start - $ past_end
"; echo "Рабочее время: $ past_sum"; // предыдущий случай добавляет разрывы для встроенного эха "

"; $ due_dates = $ sums ['future_dues']; foreach ($ due_dates as $ week_container) {$ week_start = $ week_container ['start']; $ week_end = $ week_container ['end']; $ week_sum = $ week_container ['sum']; echo "Время: $ week_start - $ week_end
"; echo "Рабочее время: $ week_sum "; // предыдущий случай добавляет разрывы, чтобы быть встроенным эхом"

";}

Редактировать: Новое, в то время как l oop было добавлено к счету для пустых недель. Примечание д / м / у не пора распознанный формат и будет читаться как м / д / у. Чтобы преобразовать , обратитесь к этому вопросу.

Edit-2: Чтобы ответить на ваш комментарий. Хорошо, так что дело в пролетах в том, что я сделал их так, чтобы, если пролет прошел с 2020-01-01 до 2020-01-08, а второй с 2020-01-08 до 2020-01-15, где должен работать часы 2020-01-08 go до недели 1 или недели 2? Если вы исправили $ entry_time <$ future_due ['end'] в $ entry_time <= $ future_due ['end'], это означает, что счет добавляется к 1-й неделе, тогда как исходное решение добавило бы его к 2-й неделе в качестве начального. свидание. </p>

Вы можете попытаться добавить 8 дней, а затем вычесть один, если вы хотите, чтобы контейнеры проходили между 2020-01-01 и 2020-01-08 и 2020-01-09 и 2020-01-16 и имели оба окончания должны быть включены. Теперь я не собираюсь писать эту часть, поскольку она действительно зависит от того, как ВЫ хотите определить свои окончания.

И ваш вопрос, можете ли вы изменить время на другое, отличное от текущего? Конечно, просто измените эту строку.

$time=strtotime(date('Y-m-d'));

//to

$time=__TIME__YOU_WANT_IN_SECONDS__;

//or

$time = strtotime(__THE_DATE_YOU_WANT__); // eg. 01/01/2020
// now this is the time to compare all other dates to
1 голос
/ 27 февраля 2020

Как не указывал Пани c о сроках исполнения, я думаю, что вы можете отображать его в формате дд / мм / ГГГГ, и я буду работать оттуда. Я буду работать с foreach l oop, но я думаю, что решение Don't Pani c может быть более эффективным.

Шаги: 1. L oop через значения и рассчитать время даты, 2. Сравнить ее с нужной датой 3. Добавить к правильной сумме

Примечания: дата формат важен, если часы, минуты и секунды отсутствуют, getTimestamp добавляет для них текущие значения

Я добавил некоторые тестовые данные, основанные на моем понимании проблемы.

У меня есть также добавлен столбец просроченных платежей в случае, если какая-либо дата уже прошла текущее время ().

foreach l oop проверяет, является ли entry_time меньшим, чем текущее время, это означает, что это past_due.

Если нет, мы проверяем, установлены ли future_dues. Будущие взносы представляют все разные недели в будущем. Если ничего не установлено, добавляется один массив с массивом. Второй массив представляет текущее ближайшее будущее, начиная с текущего времени и до конца 7 дней в будущем.

Начало и конец помогают нам лучше прочитать конечные результаты, они являются временными метками. Также добавляется ключ суммы со значением 0.

Затем мы берем последний элемент из future_dues и видим, меньше ли значение due_date, чем конец недели. Если это - мы добавляем рабочий час, иначе мы добавляем новый объект future_due.

В конце я добавил foreach l oop, который преобразует метки времени в формат даты.


$results=array(
  array( 'due_date'=>'12/02/2020', 'run_hours'=>12.4, 'setup_hours'=>2.4, ), //  2020-02-12 00:00:00
  array( 'due_date'=>'15/02/2020', 'run_hours'=>10.4, 'setup_hours'=>1.4, ), //  2020-02-15 00:00:00
  array( 'due_date'=>'18/02/2020', 'run_hours'=>8.4, 'setup_hours'=>3.4, ), //  2020-02-18 00:00:00
  array( 'due_date'=>'20/02/2020', 'run_hours'=>2.4, 'setup_hours'=>1.4, ), //  2020-02-20 00:00:00
  array( 'due_date'=>'21/02/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ), //  2020-02-21 00:00:00
  array( 'due_date'=>'24/02/2020', 'run_hours'=>12.4, 'setup_hours'=>1.4, ), //  2020-02-24 00:00:00
  array( 'due_date'=>'26/02/2020', 'run_hours'=>11.3, 'setup_hours'=>1.4, ), //  2020-02-26 00:00:00
  array( 'due_date'=>'29/02/2020', 'run_hours'=>4.4, 'setup_hours'=>2.4, ), //  2020-02-29 00:00:00
  array( 'due_date'=>'02/03/2020', 'run_hours'=>5.7, 'setup_hours'=>4, ), //  2020-03-02 00:00:00
  array( 'due_date'=>'04/03/2020', 'run_hours'=>11.5, 'setup_hours'=>3.4, ), //  2020-03-04 00:00:00
  array( 'due_date'=>'06/03/2020', 'run_hours'=>7.3, 'setup_hours'=>1.4, ), //  2020-03-06 00:00:00
  array( 'due_date'=>'08/03/2020', 'run_hours'=>9.6, 'setup_hours'=>1.4, ), //  2020-03-08 00:00:00
  array( 'due_date'=>'12/03/2020', 'run_hours'=>14.7, 'setup_hours'=>1.4, ), //  2020-03-12 00:00:00
  array( 'due_date'=>'15/03/2020', 'run_hours'=>12.5, 'setup_hours'=>1.4, ), //  2020-03-15 00:00:00
  array( 'due_date'=>'19/03/2020', 'run_hours'=>4.4, 'setup_hours'=>1.4, ), //  2020-03-19 00:00:00
  array( 'due_date'=>'21/03/2020', 'run_hours'=>5.6, 'setup_hours'=>4, ), //  2020-03-21 00:00:00
  array( 'due_date'=>'24/03/2020', 'run_hours'=>11.4, 'setup_hours'=>1.4, ), //  2020-03-24 00:00:00
  array( 'due_date'=>'29/03/2020', 'run_hours'=>7.4, 'setup_hours'=>1.4, ), //  2020-03-29 00:00:00
  array( 'due_date'=>'01/04/2020', 'run_hours'=>9.4, 'setup_hours'=>1.4, ), //  2020-04-01 00:00:00

);
$time=strtotime(date('Y-m-d')); // get time in same
// wrapping time in strtotime and date trims the seconds to the desired format

$one_week=60*60*24*7;
$sums=array();
foreach($results as $row){
 $date = DateTime::createFromFormat('d/m/Y', $row['due_date']);//use your format and values
 if(!$date){
  echo 'Not a valid format';
  break;
 }
 $entry_time = strtotime(date('Y-m-d',$date->getTimestamp()));
 // if your date format doesnt have hours minutes and seconds then timestamp will add the current h,min,s,
 // this may not be desired, so this wrapping it in strtotime and date trims the values
 $entry_work_hours=$row['run_hours']+$row['setup_hours'];
 if ($entry_time < $time) {
   if (isset($sums['future_dues'])) {
     $sums['past_due']['sum']+=$entry_work_hours;
   } else {
     $sums['past_due']= array(
      'sum'=> $entry_work_hours,
      'start'=> $row['due_date'],
      'end' => date('d/m/Y',$time),
     );
   }
 } else if ( $entry_time > $time ){
   if (isset($sums['future_dues'])) {
     $future_dues=$sums['future_dues'];
   } else {
     $future_dues = array(
       array(
         'sum'=>0,
         'start'=>$time,
         'end'=>$time+$one_week
       )
     );
   }
   $last_index = count($future_dues)-1;
   $future_due = $future_dues[$last_index];
   if ($entry_time < $future_due['end']) {
     $future_due['sum']+=$entry_work_hours;
     $future_dues[$last_index]=$future_due;
   } else {
     $future_dues[]=array(
       'sum'=>$entry_work_hours,
       'start'=>$future_due['end'],
       'end'=>$future_due['end']+$one_week
     );
   }
   $sums['future_dues']=$future_dues;
 }
}
// if you want to conver them back to dates
foreach ($sums['future_dues'] as $key => &$due) {
  $due['start']=date('d/m/Y',$due['start']);
  $due['end']=date('d/m/Y',$due['end']);
}
0 голосов
/ 28 февраля 2020

SQL Код, кажется, дает мне хорошую информацию, вот окончательная версия
SELECT DATEDIFF(week, getdate(), WORK_ORDER.DESIRED_WANT_DATE) AS week_number, SUM(OPERATION.SETUP_HRS + OPERATION.RUN_HRS) AS week_hours FROM OPERATION JOIN WORK_ORDER ON OPERATION.WORKORDER_BASE_ID = WORK_ORDER.BASE_ID WHERE OPERATION.RESOURCE_ID = '103TURRET' AND (OPERATION.STATUS = 'R' OR OPERATION.STATUS = 'F') AND WORK_ORDER.SUB_ID = '0' GROUP BY DATEDIFF(week, getdate(), WORK_ORDER.DESIRED_WANT_DATE) ORDER BY week_number;

Дает мне

week_number    week_hours
-14              0.630
-11              1.640
-8               1.980
-1               0.540
0                3.820
1                18.500
2                15.090
3                3.410
5                16.490
7                0.890
9                17.950
14               5.000
19               5.000
23               6.750
27               5.000
31               5.000

Я вручную суммирую негативы + ноль неделя = просроченная

Большое спасибо @ Не пани c за всю вашу помощь.

Эхх ... если бы кто-нибудь мог помочь мне перенести это туда, где оно всегда начинается в понедельник, а не в день его запуска, я был бы признателен.

0 голосов
/ 27 февраля 2020

Хорошо, вот код, который у меня есть. Я хотел бы, чтобы он выглядел лучше, возможно, не отображать все различные элементы в массиве ... но я боюсь измениться намного больше.

На мой взгляд, это довольно невероятный код.

<?php //CONNECTION SETTING
  $database='VMFG';
  $odbc_name='SQLServer';
  $odbc_user='sa';
  $odbc_password='Password#';
  $con = odbc_connect($odbc_name,$odbc_user,$odbc_password);

  $query="SELECT  OPERATION.WORKORDER_BASE_ID AS 'W/O #', /*STATEMENT TO PULL OPERATIONS AND PARSE WORK ORDER DATES*/
      OPERATION.WORKORDER_SUB_ID AS 'SUB ID',
      OPERATION.RESOURCE_ID AS 'RESOURCE ID',
      OPERATION.SETUP_HRS AS 'SETUP HRS',
      OPERATION.RUN AS 'RUN RATE',
      OPERATION.RUN_TYPE AS 'U/M',
      OPERATION.RUN_HRS AS 'RUN TOTAL',
      OPERATION.CALC_START_QTY AS 'START QTY',
      OPERATION.CALC_END_QTY AS 'END QTY',
      OPERATION.COMPLETED_QTY AS 'QTY COMP',
      OPERATION.DEVIATED_QTY AS 'DIFFERENCE',
      OPERATION.ACT_SETUP_HRS AS 'SETUP USED',
      OPERATION.ACT_RUN_HRS AS 'HRS RUN',
      OPERATION.STATUS,
      OPERATION.SETUP_COMPLETED AS 'SETUP COMP',
      WORK_ORDER.DESIRED_WANT_DATE AS 'DUE DATE'
      FROM OPERATION
      JOIN WORK_ORDER ON OPERATION.WORKORDER_BASE_ID=WORK_ORDER.BASE_ID
      WHERE (OPERATION.STATUS = 'R' OR OPERATION.STATUS = 'F')
      AND (OPERATION.RESOURCE_ID = '".$_GET['operation']."')
      AND WORK_ORDER.SUB_ID = '0'
      ORDER BY STATUS DESC, [DUE DATE];";
?>

<form method="get">                     <?//FORM TO CHOOSE OPERATION?>
  <table>
    <tr>
      <td>
        <select name="operation">
            <option value="103TURRET">103TURRET</option>
            <option value="104PRESSBRAKES">104PRESSBRAKES</option>
            <option value="280LASERS">280LASERS</option>
            <option value="300WELD">300WELD</option>
            <option value="701POWDERLINE">701POWDERLINE</option>
            <option value="Outside Service">Outside Server</option>
            <option value="ANYOSS">ANY OSS</option>
        </select>
      </td>
      <td><input type="submit" value="Submit" name="action" /></td>
      <td><a href='index.php'>Start Over</a></td>
      <td><a href='/xampp/mpc_db/index.php'>Return to DB</a></td>
    </tr>
  </table>
</form>

<?php
$exec = odbc_exec($con, $query);
$results = array();
while ($row = odbc_fetch_array($exec)) {
  $results[] = $row;
}
//*****************************************************************
$time=strtotime(date('Y/m/d')); // get time in same
//wrapping time in strtotime and date trims the seconds to the desired format

$one_week=604800;
$sums=array();
foreach($results as $row){
  /*$date = DateTime::createFromFormat('Y/m/d', $row['DUE DATE']);//use your format and values*/
  $date = date($row['DUE DATE']);

if(!$date){
  echo 'Not a valid format';
  break;
}  
$entry_time = strtotime(date('Y/m/d',strtotime($date)));
// if your date format doesnt have hours minutes and seconds then timestamp will add the current h,min,s,
// this may not be desired, so this wrapping it in strtotime and date trims the values
$entry_work_hours=$row['RUN TOTAL']+$row['SETUP HRS'];

if ($entry_time < $time) {
if (isset($sums['past_due'])) {
 $sums['past_due']['sum'] += $entry_work_hours;
 } else {
 $sums['past_due'] = array(
  'sum'=> $entry_work_hours,
  'start'=> $row['due_date'],
  'end' => date('Y/m/d',$time),
 );
}
} else if ( $entry_time > $time ){
if (isset($sums['future_dues'])) {
 $future_dues=$sums['future_dues'];
} else {
 $future_dues = array(
   array(
     'sum'=>0,
     'start'=>$time,
     'end'=>$time+$one_week
   )
 );
}
$last_index = count($future_dues)-1;
$future_due = $future_dues[$last_index];
if ($entry_time < $future_due['end']) {
 $future_due['sum']+=$entry_work_hours;
 $future_dues[$last_index]=$future_due;
} else {
 $future_dues[]=array(
   'sum'=>$entry_work_hours,
   'start'=>$future_due['end'],
   'end'=>$future_due['end']+$one_week
 );
}
$sums['future_dues']=$future_dues;
}
}

// if you want to convert them back to dates
foreach ($future_dues as $key => &$due) {
  $due['start']=date('Y/m/d',$due['start']);
  $due['end']=date('Y/m/d',$due['end']);
}

//**********************************************************************
foreach($sums['past_due'] as $stuff){ //Actually kind-of sort-of********
  print_r($stuff);                    //Looks like exactly**************
  echo "<br>";                        //What I am trying to create******
}                                     //Past Due Hours!*****************
//**********************************************************************

//**********************************************************************
foreach($future_dues as $edues){  //Actually kind-of sort-of************
  print_r($edues);                //Looks like exactly******************
  echo "<br>";                    //What I am trying to create**********
}                                 //Future Hours!***********************
//**********************************************************************

?>  

Лучшая часть! Мой вывод читабелен!

5.26

2020/02/27
Array ( [sum] => 9.26 [start] => 2020/02/27 [end] => 2020/03/05 )
Array ( [sum] => 7.31 [start] => 2020/03/05 [end] => 2020/03/12 )
Array ( [sum] => 6.27 [start] => 2020/03/12 [end] => 2020/03/19 )
Array ( [sum] => 2.14 [start] => 2020/03/19 [end] => 2020/03/26 )
Array ( [sum] => 11.82 [start] => 2020/03/26 [end] => 2020/04/02 )
Array ( [sum] => 6.95 [start] => 2020/04/02 [end] => 2020/04/09 )
Array ( [sum] => 36 [start] => 2020/04/09 [end] => 2020/04/16 )
Array ( [sum] => 0.81 [start] => 2020/04/16 [end] => 2020/04/23 )
Array ( [sum] => 30.98 [start] => 2020/04/23 [end] => 2020/04/30 )
Array ( [sum] => 1.3 [start] => 2020/04/30 [end] => 2020/05/07 )
Array ( [sum] => 3.29 [start] => 2020/05/07 [end] => 2020/05/14 )
Array ( [sum] => 1.57 [start] => 2020/05/14 [end] => 2020/05/21 )
Array ( [sum] => 1.95 [start] => 2020/05/21 [end] => 2020/05/28 )
Array ( [sum] => 0.29 [start] => 2020/05/28 [end] => 2020/06/04 )
Array ( [sum] => 2.19 [start] => 2020/06/04 [end] => 2020/06/11 )
Array ( [sum] => 1.57 [start] => 2020/06/11 [end] => 2020/06/18 )
Array ( [sum] => 1.95 [start] => 2020/06/18 [end] => 2020/06/25 )
Array ( [sum] => 1.3 [start] => 2020/06/25 [end] => 2020/07/02 )
Array ( [sum] => 3.29 [start] => 2020/07/02 [end] => 2020/07/09 )
Array ( [sum] => 0.67 [start] => 2020/07/09 [end] => 2020/07/16 )
Array ( [sum] => 0.33 [start] => 2020/07/16 [end] => 2020/07/23 )
Array ( [sum] => 2.73 [start] => 2020/07/23 [end] => 2020/07/30 )
Array ( [sum] => 17.79 [start] => 2020/07/30 [end] => 2020/08/06 )
Array ( [sum] => 1.57 [start] => 2020/08/06 [end] => 2020/08/13 )
Array ( [sum] => 1.95 [start] => 2020/08/13 [end] => 2020/08/20 )
Array ( [sum] => 1.3 [start] => 2020/08/20 [end] => 2020/08/27 )
Array ( [sum] => 3.29 [start] => 2020/08/27 [end] => 2020/09/03 )
Array ( [sum] => 1.3 [start] => 2020/09/03 [end] => 2020/09/10 )
Array ( [sum] => 3.29 [start] => 2020/09/10 [end] => 2020/09/17 )
Array ( [sum] => 1.57 [start] => 2020/09/17 [end] => 2020/09/24 )
Array ( [sum] => 1.95 [start] => 2020/09/24 [end] => 2020/10/01 )  

Хотя я не могу понять, как манипулировать им, не нарушая его ...

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