Управление расписанием в цикле PHP foreach - PullRequest
0 голосов
/ 07 августа 2020

У меня есть таблица, как показано ниже

Итак, есть приоритет и sqft, я хочу начать производственный график (с текущей даты), который каждый день будет обрабатывать 1700 SQFT, как показано на изображении ниже

но, как вы можете видеть, он не работает

Я пробовал код ниже

foreach($priorityArraySum as $key=>$val)
{
                    
   $totalDays=ceil($val/1700);
   $cutSQFT=$val;
                    
    for($j=1;$j<=$totalDays;$j++)
    {
        if($cutSQFT>1700)
        {
          echo '1700';
         $cutDate=date('Y-m-d', strtotime($cutDate. ' + 1 days'));
         $cutSQFT=$cutSQFT-1700;
        }
        else
        {
          echo $cutSQFT;
          $cutSQFT=$cutSQFT-$cutSQFT;
        }
    }

}

@ Nigel, чтобы сделать это динамическим c, Я изменил код на приведенный ниже, но он не работает.

$pln_qry=mysql_query("select * from tbl_mfg_schedule where ms_date='".$today."'") or die(mysql_error());
                $pln_data=mysql_fetch_array($pln_qry);
                
                $max = $pln_data['ms_po_sqft'];
                $dailyLeft = $max;
                $current = reset($priorityArraySum);
                $output = [];
                //$day = date('Y-m-d');
                $day = date('Y-m-d');
                while (true)    {
                    
                    $pln_qry=mysql_query("select * from tbl_mfg_schedule where ms_date='".$today."'") or die(mysql_error());
                    $pln_data=mysql_fetch_array($pln_qry);
                
                    $max = $pln_data['ms_po_sqft'];
                
                        if ( $current >= $dailyLeft )   {
                            //$day=date('Y-m-d', strtotime($day. ' + 1 days'));
                            $output[] = ["priority" => key($priorityArraySum),
                                    "amount" => $dailyLeft,
                                    "day" => $day
                            ];
                            $day=date('Y-m-d', strtotime($day. ' + 1 days'));
                            $current -= $dailyLeft;
                            $dailyLeft = $max;
                        }
                        else    {
                            $output[] = ["priority" => key($priorityArraySum),
                                    "amount" => $current,
                                    "day" => $day
                            ];
                            $dailyLeft -= $current;
                            if ( ($current = next($priorityArraySum)) === false )   {
                                break;
                            }
                        }
                    
                    
                }

1 Ответ

0 голосов
/ 07 августа 2020

Этот код использует while() l oop для создания выходного массива рабочих дней. Он использует $current для отслеживания каждого элемента и того, сколько осталось выделить. Он также использует $dailyLeft, чтобы отслеживать, сколько ресурсов осталось в определенный день. Он проверяет эти два параметра и, если текущий объем меньше оставшейся дневной емкости, выделяет этому элементу полный день и сбрасывает дневную емкость. Если на этот день есть дополнительная емкость, он выделяет этот элемент на этот день и получает следующий элемент.

День увеличивается (с использованием $day++) только тогда, когда емкость для этого дня заполнена ...

$max = 1700;
$dailyLeft = $max;
$current = reset($priorityArraySum);
$output = [];
$day = 1;
while (true)    {
    // echo $current."/".$dailyLeft."=".$day.PHP_EOL;
    if ( $current >= $dailyLeft )   {
        $output[] = ["priority" => key($priorityArraySum),
                "amount" => $dailyLeft,
                "day" => $day++
        ];
        $current -= $dailyLeft;
        $dailyLeft = $max;
    }
    else    {
        $output[] = ["priority" => key($priorityArraySum),
                "amount" => $current,
                "day" => $day
        ];
        $dailyLeft -= $current;
        if ( ($current = next($priorityArraySum)) === false )   {
            break;
        }
    }
}
print_r($output);
...