0

時間範囲のチェックに問題があります。

<?php

$starthour = '08'; //Starting work hour
$finishhour = '23'; //Finishing work hour
$extrapaidhours = 0; //Counting extrapaying hours

if($starthour <= 5) {
    if($starthour==5) { $extrapaidhours += 5; }
    else { $extrapaidhours += 5 - $starthour; }
}

if($starthour > 22) {
    $extrapaidhours += 24 - $starthour;
}


if($finishhour <= 5) {
    if($finishhour==5) { $extrapaidhours += 5; }
    else { $extrapaidhours += 5 - $finishhour; }
}

if($finishhour > 22) {
    $extrapaidhours += 24 - $finishhour;
}

echo $extrapaidhours;

私はちょっとスタックしています、私のロジックは間違っていると思います。私は22-05の間の時間を取得しようとしています。

おそらく、誰かが 21:00 から 05:00 まで働き始め、22:00 から 05:00 までの 7 時間というこの範囲内の時間外の有給を取っているとします。

どうすればこれに対処できますか。皆さん、ありがとうございました。

4

2 に答える 2

0

これは可能な解決策です。

2つの異なるケースを考慮する必要があります。

最初:$starthour < $finishhour -> $starthourそして$finishhour同じ日にあります2番目:$starthour > $finishhour -> $starthourそして$finishhour2つの異なる日にあります

このソリューションは、残りの1つのif/elseステートメントとmax/関数のみを使用しますmin

<?php
    $starthour = '08';      //Starting work hour
    $finishhour = '23';     //Finishing work hour
    $extrapaidhours = 0;    //Counting extrapaying hours

    if ($starthour < $finishhour) 
        $extrapaidhours += (min($finishhour,5)-min($starthour,5))
                        + (max($finishhour,22)-max($starthour,22));
    else
        $extrapaidhours += (5-min(5,$starthour))
                        + (24-max(22,$starthour))
                        + min(5,$finishhour)
                        +(max($finishhour,22)-22);
    echo $extrapaidhours;
?>
于 2012-08-27T10:49:26.190 に答える
0

私はあまり人気のないPHP関数と非標準的なアプローチを試してみるのが好きです:)

<?php
$start_hour = '19'; //Starting work hour
$finish_hour = '08'; //Finishing work hour
$extra_paid_hours = array(22, 23, 0, 1, 2, 3, 4, 5); //list of extra paid hours

if ($start_hour <= $finish_hour) {
    $hours = range(intval($start_hour), intval($finish_hour));
} else {
    $hours = array_merge(range(intval($start_hour), 23), range(0, intval($finish_hour)));
}

$extra_paid_hours_count = array_reduce($hours, function($accum, $hour) use($extra_paid_hours) {
        $accum += in_array($hour, $extra_paid_hours) ? 1 : 0;
        return $accum;
    }, 0);

echo $extra_paid_hours_count;
于 2012-08-27T11:46:27.937 に答える