需要在此循环中将常量更改为动态

Need to change the constant to dynamic in this loop

我是 运行 制造计划(使用 PHP 代码),但目前它是静态的(意味着我无法添加假期或我无法更改制造能力 - 当前制造能力是静态的,每天 1700 平方英尺)

请看下面代码

$max = 1700;
$dailyLeft = $max;
$current = reset($priorityArraySum);
$output = [];
//$day = date('Y-m-d');
$day = date('Y-m-d');
while (true)    {
  // echo $current."/".$dailyLeft."=".$day.PHP_EOL;
  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;
    }
  }
}
echo '<pre/>';
print_r($output);
echo '<pre/>';
exit;

使用上面的代码,我可以安排我的制造计划,见下图

current schedule image

当前代码的问题是,我们有每天 1700 的静态容量,我们希望有动态容量,例如第 1 天 1700,第 2 天 1900,假期 0。

我们如何更改此代码以使其动态化?

目前我正在尝试下面的代码,但它不起作用

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

这是基于您显示的第二个代码。一个问题是您总是将这一天向前推进,并且您应该只在 if() 的第一部分执行此操作,这是天容量已满的地方。

为了方便起见,我还循环检索了所有日期和容量,并将它们存储在以日期为键的数组中。

$today=date('Y-m-d');
$pln_qry=mysql_query("select * 
    from tbl_mfg_schedule 
    where ms_date > '".$today."' 
    order by ms_date") or die(mysql_error());
// Load list of days and production
$plnList = [];
while ( $pln_data=mysql_fetch_array($pln_qry) ) {
    $plnList [ $pln_data['ms_date'] ] = $pln_data['ms_po_sqft'];
}


$current = reset($priorityArraySum);
$output = [];
$day = date('Y-m-d');
// Set max from production plan
$max = $plnList[ $day ];
//$max = 1700;
$dailyLeft = $max;
while (true)    {
    //echo $dailyLeft."</br>";
    
    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;
        
        // Move onto the next days capacity, if no specific value assume
        // same as last ( ?? $max)
        $max = $plnList[ $day ] ?? $max;
        $dailyLeft = $max;
        
    }
    else    {
        $output[] = ["priority" => key($priorityArraySum),
                "amount" => $current,
                "day" => $day
        ];
        $dailyLeft -= $current;
        if ( ($current = next($priorityArraySum)) === false )   {
            break;
        }
    }
    
}
echo '<pre/>';
print_r($output);
echo '<pre/>';

使用一些虚拟测试数据(注意缺少日期 2020-08-14,因此假定它与 2020-08-13...

相同
$priorityArraySum = [2000, 200, 6000, 1200];

$plnList = [ '2020-08-10' => 1700,
        '2020-08-11' => 1700,
        '2020-08-12' => 0,
        '2020-08-13' => 500,
        '2020-08-15' => 1700];

它产生...

<pre/>Array
(
    [0] => Array
        (
            [priority] => 0
            [amount] => 1700
            [day] => 2020-08-10
        )

    [1] => Array
        (
            [priority] => 0
            [amount] => 300
            [day] => 2020-08-11
        )

    [2] => Array
        (
            [priority] => 1
            [amount] => 200
            [day] => 2020-08-11
        )

    [3] => Array
        (
            [priority] => 2
            [amount] => 1200
            [day] => 2020-08-11
        )

    [4] => Array
        (
            [priority] => 2
            [amount] => 0
            [day] => 2020-08-12
        )

    [5] => Array
        (
            [priority] => 2
            [amount] => 500
            [day] => 2020-08-13
        )

    [6] => Array
        (
            [priority] => 2
            [amount] => 500
            [day] => 2020-08-14
        )

    [7] => Array
        (
            [priority] => 2
            [amount] => 1700
            [day] => 2020-08-15
        )

    [8] => Array
        (
            [priority] => 2
            [amount] => 1700
            [day] => 2020-08-16
        )

    [9] => Array
        (
            [priority] => 2
            [amount] => 400
            [day] => 2020-08-17
        )

    [10] => Array
        (
            [priority] => 3
            [amount] => 1200
            [day] => 2020-08-17
        )

)