2016-05-11 2 views
1

チャレンジがある:本が上か、期待収益日の前に返されこの特定の条件をPHPでどのように書くべきですか?

  • 場合、 罰金が課金されます(すなわち:罰金= 0)。
  • 書籍が返品予定日の後に返品され、返品予定日と同じ年月の中に が残っている場合は、 細かい= 15ハコス×(遅くなった日数)。
  • 返品予定月の後に書籍が返品され、返品予定日と同じ暦年内に が残っている場合は、 細かい= 500ハックス×(月数が遅くなります)。
  • 本はそれが 予想された暦年の後に返された場合、10000 Hackosの固定の罰金があります。

そして、私のコードは次のとおりです。

$expectedDay = "28"; 
$expectedMonth = "2"; 
$expectedYear = "2015"; 

$returnDay  = "15"; 
$returnMonth = "4"; 
$returnYear = "2015"; 

私は、この条件のために書く方法:入力されたときに

<?php 
$expectedDay = "6"; 
$expectedMonth = "6"; 
$expectedYear = "2015"; 

$returnDay  = "9"; 
$returnMonth = "6"; 
$returnYear = "2015"; 
if ($expectedDay >= $returnDay && $expectedMonth >= $returnMonth && $expectedYear >= $returnYear) { 
    echo "Fine = 0"; 
}elseif ($expectedDay < $returnDay && $expectedMonth == $returnMonth && $expectedYear == $returnYear) { 
    $fine = 15 * ($returnDay-$expectedDay); 
    echo "Fine = ".$fine; 
}elseif (($expectedDay <= $returnDay || $expectedDay >= $returnDay) && $expectedMonth < $returnMonth && $expectedYear == $returnYear) { 
    $fine = 500 * ($returnMonth-$expectedMonth); 
    echo "Fine = ".$fine; 
}else{ 
    echo "Fine = 1000"; 
} 

?> 
well.Butを実行している

その失敗しましたか?ありがとうございました。

注:これはビジネスロジックではありません。これはPHPの初心者です。

+1

使用http://php.net/manual/en/class.datetime.phpをdownvoteいけませんそれがReinventTheWheelチャレンジでない限り – strangeqargo

答えて

1

月の条件が選択されている場合は、日付を比較する必要はありません。

<?php 
$expectedDay = "6"; 
$expectedMonth = "6"; 
$expectedYear = "2015"; 

$returnDay  = "9"; 
$returnMonth = "6"; 
$returnYear = "2015"; 
$returnDate = new DateTime($returnDay.'-'.$returnMonth.'-'.$returnYear); 
$expectedDate = new DateTime($expectedDay.'-'.$expectedMonth.'-'.$expectedYear); 

if ($returnDate <= $expectedDate) { 
    echo "Fine = 0"; 
}elseif ($expectedDay < $returnDay && $expectedMonth == $returnMonth && $expectedYear == $returnYear) { 
    $fine = 15 * ($returnDay-$expectedDay); 
    echo "Fine = ".$fine; 
}elseif ($expectedMonth < $returnMonth && $expectedYear == $returnYear) { 
    $fine = 500 * ($returnMonth-$expectedMonth); 
    echo "Fine = ".$fine; 
}else{ 
    echo "Fine = 1000"; 
} 

?> 

これを試してください。ロジック上

+0

なぜそれはdownvotedですか?私はちょうど日付で行われている不要な比較を指摘しました。 – Nisha

+1

私のdownvoteではなく、なぜそんなに複雑ですか?後ろ向きに作業すると、条件がかなり複雑になります。 – Yoshi

+0

$ expectedDay = "1"を入力するとコードが失敗します。 $ expectedMonth = "1"; $ expectedYear = "1015"; $ returnDay = "2"; $ returnMonth = "7"; $ returnYear = "1014"; –

0
if($returnYear > $expectedYear){ 
    $fine = 1000; 
} 
else{ 
    if($returnMonth > $expectedMonth){ 
     $fine = 500 * ($returnMonth-$expectedMonth); 
    } 
    else{ 
     if($returnDay>$expectedDay){ 
       $fine = $returnDay - $expectedDay; 
      } 
      else{ 
       $fine = 0; 
      } 

    } 
} 

echo $fine; 

交差数ヶ月は完全な月のコスト例取ることを考慮して構築されています。期待収益日は28/04/2016であり、実際の返却日が2016年2月5日である場合

を月が変更されて以来、以下のアルゴリズムは、@completeの罰金を要します。

あなたがヶ月/年の計算のために考慮すべき正確な日数の差をつけたいならば、我々はすべて一緒に

3

を別のロジックを記述することができ、これらの線に沿って何か:

function calculateLateFees(DateTime $deadline, DateTime $returned) { 
    if ($returned <= $deadline) { 
     return 0; 
    } 
    if ($returned->format('Y') > $deadline->format('Y')) { 
     return 10000; 
    } 
    if ($returned->format('n') > $deadline->format('n')) { 
     return ($returned->format('n') - $deadline->format('n')) * 500; 
    } 
    return $deadline->diff($returned)->days * 15; 
} 

$deadline = new DateTime('2015-02-28'); 
$returned = new DateTime('2015-04-15'); 

echo calculateLateFees($deadline, $returned), ' Hackos'; 
+0

このメソッドには欠陥があります。予想される日付が31.12.2015で、返された日付が01.01.2016の場合、その罰金は10000です。しかし、ちょうど1日遅れです。 –

+2

それは記述されたビジネスロジックの欠陥であり、その質問の下のコメントで既に表現されているものです。私にとっては、実際のビジネスロジックではなく、明らかにFizzBu​​zzテストです。これは実装上の欠陥ではありません。 – deceze

1

まず、私はこのことを言わなければなりません非常に不公正な罰金の計算です。予想される日が31.12.2016で、本が01.01.2017に返された場合はどうなりますか?あなたの方法によると、10000の罰金は、それが2つの別々の年のマージンを越えていたという理由だけで、1日の経過の間課されます。

私は、あなたが遅れた日数に応じて罰金を計算することをお勧めします。

$lateDays = date_diff($expectedDate, $returnDate, false); 

if ($lateDays > 0) { 

    if ($lateDays < 30) 
     $fine = 15 * $lateDays 
    else 
     if ($lateDays > 365) 
     $fine = 10000 
     else    
     $fine = 500 * $lateDays/30 

} 
+0

これはビジネスロジックではありません。ちょうどPHPの初心者です。 –

+0

実践的な目的のためには、これは設計の欠陥を特定する良い機会です。 –

0

まずPHPコードは、plzは、車輪の再発明をしていない、たくさん:)

<?php 
$expectedDay = "6"; 
$expectedMonth = "6"; 
$expectedYear = "2015"; 

$returnDay  = "9"; 
$returnMonth = "6"; 
$returnYear = "2015"; 

$expectedate=$expectedYear.'-'.$expectedMonth.'-'.$expectedDay; 
$returndate=$returnYear.'-'.$returnMonth.'-'.$returnDay; 

$expected=date_create($expectedate); 
$return=date_create($returndate); 

$interval=date_diff($expected, $return); 
$valor=$interval->format('%R%a'); 

if ($valor>0) { 

    if ($returnMonth==$expectedMonth && $returnYear==$expectedYear) echo "Fine=".(15*$valor); 
    if ($returnMonth!=$expectedMonth && $returnYear==$expectedYear) echo "Fine=".(500*($returnMonth-$expectedMonth)); 
    if ($returnYear!=$expectedYear) echo "Fine=1000"; 

} else echo "Fine=0"; 
?> 
関連する問題