0

私は40人のゴルフリーグを持っています。私たちは皆、ポットにお金を投げ、最終スコアに基づいて最初の6つの場所を支払います。

同点がなければ、支払いは簡単ですが、たとえば、2人が1位、3人が2位、1人が3位など、多くの場合、バリエーションは無限に見えます。

PHPを使用して、場所ごとに計算された支払いを自動化しようとしていますが、成功していません。提案、ヘルプ、または正しい方向への指示をいただければ幸いです。他の誰かがこのサイトで同様の質問をしようとしたが、質問を組み立てることができなかったことに気づきました。もっといい仕事をしようと思います。

これが私が遊んでいるいくつかのデータです:

$playerNumber=40;
$totalPoints=100;

支払い:

$pointsFirst=0.6*$totalPoints;
$pointsSecond=0.2*$totalPoints;
$pointsThird=0.15*$totalPoints;
$pointsFourth=0.03*$totalPoints;
$pointsFifth=0.02*$totalPoints;
$pointsSixth=0.01*$totalPoints;

上記の例で、6つの場所を支払う場合、支払いは次のように計算されます。2人が1位で同点の場合、1位と2位のポイントを加算し、2で割ります。3人が2位で同点の場合、3位、4位、5位のポイントを加算し、3で割ります。1人が3番目に一人でいる場合、この人は6位のポイントを獲得します。

特定の場所にいる、または同点のプレーヤーの数を数えることができます。

$countFirst=2;
$countSecond=3;
$countThird=1;
$countFourth=2;
$countFifth=1;
$countSixth=2;

この例では、プレーヤーのスコアは72、72、73、73、73、74、75、75、76、77、77になります。

最初は、これはネストされた配列のアプリケーションだと思いました。それから、おそらく配列や配列スライスなどを使用するのが良い方法かもしれないと思いました。森にたどり着くたびに。私は論理を見ていません。

私は3つの場所を支払うために条件付きステートメントを使用しましたが、この方法で6つの場所を支払うことは、私を森の奥深くに置きます。

条件付きステートメントを使用した3か所への支払いの例:

$pointsFirst=0.5*$totalPoints;
$pointsSecond=0.3*$totalPoints;
$pointsThird=0.2*$totalPoints;          

if($countFirst>2) {  

    $ptsA=round($totalPoints/$countFirst,2);
}
elseif($countFirst==2) {

    $ptsA=round(($pointsFirst+$pointsSecond)/2,2);

    if($countSecond>1) { 

        $ptsB=round($pointsThird/$countSecond,2);                   
    }
    elseif($countSecond==1) {

        $ptsB=round($pointsThird,2);                    
    }
}
elseif($countFirst==1) { 

    $ptsA=round($pointsFirst,2);

    if($countSecond>1) {

        $ptsB=round(($pointsSecond+$pointsThird)/2,2);                  
    }
    elseif($countSecond==1) {

        $ptsB=round($pointsSecond,2);                   

        if($countThird>1) {

            $ptsC=round($pointsThird/$countThird,2);                        
        }
        elseif($countThird==1) {

            $ptsC=round($pointsThird,2);                        
        }
    }
}

私の要求が明確になったことを願っています。何でも明確にさせていただきます。6か所への支払い計算を効率的に自動化する方法について誰かが何かアイデアを持っているなら、私は永遠に感謝します。ありがとうございました!マイク

リクエストごと:

$scores=array();
$scores[0]=72;
$scores[1]=72;
$scores[2]=73;
$scores[3]=73;
$scores[4]=73;
$scores[5]=74;
$scores[6]=75;
$scores[7]=75;
$scores[8]=76;
$scores[9]=77;
$scores[10]=77;

$payout=array();
$payout[0]=0.6*$totalPoints;
$payout[1]=0.2*$totalPoints;
$payout[2]=0.15*$totalPoints;
$payout[3]=0.03*$totalPoints;
$payout[4]=0.02*$totalPoints;
$payout[5]=0.01*$totalPoints;

$countScores=array();
$countScores[0]=$countFirst;
$countScores[1]=$countSecond;
$countScores[2]=$countThird;
$countScores[3]=$countFourth;
$countScores[4]=$countFifth;
$countScores[5]=$countSixth;
4

1 に答える 1

0

まず、支払いに問題があります。それらを合計すると、得られ1.01ません1
0.6 (1st) + 0.2 (2nd ) + 0.15 (3rd) + 0.03 (4th) + 0.02 (5th) + 0.01 (6th) = 1.01

第二に、あなたがあなたPayoutsCountsを配列にするともっと簡単です-
これらを変更してください-

$pointsFirst=0.6*$totalPoints;
$pointsSecond=0.2*$totalPoints;
$pointsThird=0.15*$totalPoints;
$pointsFourth=0.03*$totalPoints;
$pointsFifth=0.02*$totalPoints;
$pointsSixth=0.01*$totalPoints;

$countFirst=2;
$countSecond=3;
$countThird=1;
$countFourth=2;
$countFifth=1;
$countSixth=2;

これらに

$payout=array();
$payout[0]=0.6*$totalPoints;
$payout[1]=0.2*$totalPoints;
$payout[2]=0.15*$totalPoints;
$payout[3]=0.03*$totalPoints;
$payout[4]=0.02*$totalPoints;
$payout[5]=0.01*$totalPoints;

$count=array();
$count[0]=2;
$count[1]=3;
$count[2]=1;
$count[3]=2;
$count[4]=1;
$count[5]=2;

これがそれを行う1つの方法の始まりです。最終的にはこれを関数に変更して、さまざまな支払いと場所の数で再び使用できるようにしますが(以下のphpfiddleの例を参照)、これは4つのステップで表示されます-

ステップ1

// Add together the payments if there are ties - ie. 2 tied for first $payout[0]+$payout[1], etc
$payout_groups = array();  // start a payout array
$payout_groups_key = 0;   // array key count
$payout_groups_count = 0;  // array counter, use to match the $count array values
for($w=0;$w<count($payout);$w++){  // 
    if(array_key_exists($payout_groups_key,$payout_groups)){
        $payout_groups[$payout_groups_key] += $payout[$w];  // if there are ties, add them together
    }
    else{
        $payout_groups[$payout_groups_key] = $payout[$w];  // else set a new payout level
    }
    $payout_groups_count++;  // increase the counter
    if($payout_groups_count == $count[$payout_groups_key]){   // if we merged all the ties, set a new array key and restart the counter
       $payout_groups_key++; 
       $payout_groups_count = 0;
    }

}

ステップ2

// basic counter to get how many placers/winners. This makes it possible to have ties for 6th (last) place
$x = 0;
$y = 0;
while($y < count($payout)){ 
   $y += $count[$x];  // the $count array values until we reach the amount of places/payouts
   $x++;
}

ステップ3

// Create array for winnings per placing
$winnings = array();  // start an array
$placings_count = 0;  // 
$placings_counter = 0;
for($z=0;$z<$y;$z++){
    $winnings[$z] = $payout_groups[$placings_count]/$count[$placings_count];

    $placings_counter++;

    if($placings_counter == $count[$placings_count]){
       $placings_count++;
       $placings_counter = 0;
    }
}

ステップ4

// Assign winnings to scorecard
$scoreboard = array();
for($t=0;$t<count($winnings);$t++){
$scoreboard[$t]['score'] = $scores[$t]; 
$scoreboard[$t]['payout'] = $winnings[$t];
}

これは、 http://phpfiddle.org/main/code/a1g-qu0で定義された値を使用して確認できます。

上記と同じコードを使用して、支払い額を変更し、7位に増やしました-http://phpfiddle.org/main/code/uxi-qgt

于 2013-03-16T21:06:59.637 に答える