0

这是我的新代码,它几乎可以工作,但我认为我的 while 循环在哪里出错了?

和以前一样,让用户生病将其放入一个 var。然后根据用户的服务年限获取用户的权利,然后计算出他们已经拿走了什么,看看用户是否已经使用了所有的全部权利,然后看他们是否已经使用了所有的半薪权利。

请帮忙?

if($this->CURRENT_USER['User']['role_id'] > 3) { //locks out user types

        //Get Holidaytypes
        $types = $this->Holiday->find(
            'all',
            array(
             'conditions' => array(
                                 'Holiday.holidaystype_id' => 3,
                                 'Holiday.user_id' => $id
             )));

        //Get starting date
        $contracts = $this->Holiday->User->Contract->find(
            'all',
            array(
                'conditions' => array(
                'Contract.user_id' => $id//$data['user_id']),
                'order' => array('Contract.startson' => 'ASC')
            )
        );
    //Get How Many sick days
    foreach ($types as $key => $value) {
            global $SickTotal; 
            $typesDataEnds =  strftime ("%u-%d-%Y", $types[$key]['Holiday']['endson']);
            $typesDataStarts = strftime ("%u-%d-%Y", $types[$key]['Holiday']['startson']);

            $SickTotal = count($typesDataEnds - $typesDataStarts);  
            //echo $SickTotal;

        //Get Contract Start & End Dates
        $start = array_shift($contracts);
        $end = array_pop($contracts);

        $endDate = $end['Contract']['endson'];
        $startDate = $start['Contract']['startson'];

        if (empty($endDate)) {
                $endDate = time('now');
        }
        if (!empty($startDate)) {
            $SortEnd = strftime("%Y", $endDate);
            $SortStart = strftime("%Y", $startDate);
            $YearsService = $SortEnd - $SortStart;

            if ($YearsService <= 1) {
                    $SetFullEntitlement = 5;
                    $SetHalfEntitlement = 5;
                    //echo 'one year';
            } elseif ($YearsService >= 2) {
                    $SetFullEntitlement = 10;
                    $SetHalfEntitlement = 10;
                    //echo 'two years';
            } elseif ($YearsService >= 5) {
                    $SetFullEntitlement = 20;
                    $SetHalfEntitlement = 20;
                    //echo 'up to five years';
            } elseif ($YearsService > 5) {
                    $SetFullEntitlement = 30;
                    $SetHalfEntitlement = 30;
                    //echo 'five years or more';
            } else {
                    $SetFullEntitlement = 0;
                    $SetHalfEntitlement = 0;
                    //echo 'no sick pay';
            }
        } else {
            $YearsService = 0;
            //echo 'Sorry No Start Date For You Found!';
        }

        while ($SickTotal > 0) {
            if ($SetFullEntitlement != 0) {
                $SetFullEntitlement--;
            } elseif ($SetHalfEntitlement != 0) {
                $SetHalfEntitlement--;
            }
        }

        echo 'FullPay:';
        echo $SetFullEntitlement;
        echo '<br/><br/>Halpay:';
        echo $SetHalfEntitlement;
        echo $SickTotal;
    } 

        debug($types);
        die();  
        //$this->render('/artists/holidayslist');

    }       
}
4

2 回答 2

1
If ($startdate <= 1 year) {

如果这就是你输入的字面意思,那它是行不通的。也许 strtotime 可能会有所了解?

任何状况之下,

 For ($i = $Totalsick, $i >= $Fulldays, $i--) {
    For ($i = $Totalsick, $>= $Halfdays, $i--) {

您在其中缺少 $i - 您没有针对 $Halfdays 进行任何评估。您还将 $i 用于两个单独的循环,因此它们都在同一个计数器上。切换第二个循环以使用不同的变量。

于 2012-06-27T09:57:35.070 回答
0

我不太确定我是否完全按照您在此处尝试执行的操作,但您可以稍微整理一下代码并节省代码行。我假设这$startdate是用户在几年前开始的。

$sickdays= array( 0=>5, 1=>10, 2=>20, 5=>30 );
$userdays= 0;
foreach ( array_keys( $sickdays ) as $years_service )
{
   if ( $years_service <= $startdate )
      $userdays=$sickdays[$years_service];
}

现在$userdays应该是该用户的正确带薪病假天数和半天数(在您的示例中两者始终相同)。一个简单的比较应该足以检查他们是否花费了少于或多于分配的天数和半天数。

我没有尝试过,因为我今天没有使用 PHP,所以我相信有人会直接击落我,但是通过设置一次变量并编写更少的行,你应该会发现你的代码更容易维护。

于 2012-06-27T10:12:50.597 回答