4

GPA Calculator を作成しようとしています。PHPファイルに送信し、フォームからのすべてのデータをphp array()に保存するフォームがあります。同じ値を入力するまで、電卓はうまく機能します。いくつかの写真を表示するまで、これは意味がないと思います。

画像の問題は次のとおりです。

エラーシナリオ

正しいシナリオ

したがって、最初の画像では A を入力し、次に var_dump() を使用すると array(1) { [0]=> float(4.5) } を出力する別の A を入力します

2 番目の画像では、var_dump() は array(2) { [0]=> float(4) 1 => float(3.5) }です。

最初の画像の最初の行をスキップしています...AがREGで4.0、HONORSで4.5に等しい場合に備えて。array_combine() かもしれません

これが私のphpコードです:

//$_POST['grades'] for the grades <option> and $_POST['types'] for the type (REG, HONORS)
foreach(array_combine($_POST['grades'], $_POST['types']) as $code => $count)
{

    if ($code == "A")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 4.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 4.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 5.0;
        }
    }
    else if ($code == "B")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 3.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 3.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 4.0;
        }
    }
    else if ($code == "C")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 2.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 2.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 3.0;
        }
    }
    else if ($code == "D")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 1.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 1.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 2.0;
        }
    }
    else if ($code == "F")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 0.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = .5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 1.0;
        }
    }


}

やり直す必要があるのは foreach() ステートメント全体かもしれません...誰かがそう言うなら、私はロジックをもう一度書くつもりです...

コードで質問を詰まらせたくないので、html が絶対に必要な場合は、質問してください。編集を追加します。

EDIT:ロジックを書き直す必要があるとも考えています...以前はarray_combine()を使用したことがありません...関連するものと対応していることを確認するだけです

助けてくれてありがとう!

4

4 に答える 4

3

2 つ (またはそれ以上) の配列を反復処理する場合は、MultipleIterator;の使用を検討できます。のように配列キーを上書きしませんarray_combine()

配列を使用して各グレード/タイプの組み合わせのスコアを定義することで、ロジックを簡素化することもできます。

$gradesToScores = array(
  'REGULAR' => array(
    'A' => 4.0, 'B' => 3.0, 'C' => 2.0, 'D' => 1.0, 'F' => 0.0,
  ),
  'HONORS' => array(
    'A' => 4.5, 'B' => 3.5, 'C' => 2.5, 'D' => 1.5, 'F' => 0.5,
  ),
  'COLLEGE' => array(
    'A' => 5.0, 'B' => 4.0, 'C' => 3.0, 'D' => 2.0, 'F' => 1.0,
  ),
);

$gradeItemIterator = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$gradeItemIterator->attachIterator(new ArrayIterator($_POST['grades']), 'grade');
$gradeItemIterator->attachIterator(new ArrayIterator($_POST['types']), 'type');

$gradeScores = array();

foreach ($gradeItemIterator as $gradeItem) {
  $gradeScores[] = $gradesToScores[$gradeItem['type']][$gradeItem['grade']];
}
于 2013-01-17T04:01:54.470 に答える
1

この配列を見て、出力は結果の配列のキーになるVALUES "a"を見てください。したがって、完全な配列を最初の配列のキーと組み合わせる場合、最初の配列は一意の値を持っている必要があります。

  <?php
    print_r(array_combine(Array('a','a','b'), Array(1,2,3)));
    ?>
    Returns:
    Array
    (
        [a] => 2
        [b] => 3
    )

解決策(最善ではないかもしれません)

foreach($_POST['grades'] as $KEY=>$code)
{
   $count  = $_POST['types'][$KEY];
   if ($code == "A")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 4.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 4.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 5.0;
        }
    }
    else if ($code == "B")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 3.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 3.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 4.0;
        }
    }
    else if ($code == "C")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 2.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 2.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 3.0;
        }
    }
    else if ($code == "D")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 1.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = 1.5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 2.0;
        }
    }
    else if ($code == "F")
    {
        if ($count == "REGULAR")
        {
            $GradeArray[] = 0.0;
        }
        else if ($count == "HONORS")
        {
            $GradeArray[] = .5;
        }
        else if ($count == "COLLEGE")
        {
            $GradeArray[] = 1.0;
        }
    }

}
于 2013-01-17T03:55:46.530 に答える
1

行動の理由については、アルンに同意します。考えられる解決策は次のとおりです。

$lookup = Array("A"=>4, "B"=>3, "C"=>2, "D"=>1, "F"=>0);

for ( $i=0; $i<count($_POST['grades']); $i++ ) {
    $temp = $lookup[ $_POST['grades'][$i] ];
    if ( $_POST['types'][$i] == "HONORS" ) {
        $temp += .5;
    }
    elseif ( $_POST['types'][$i] == "COLLEGE" ) {
        $temp += 1;
    }
    $GradeArray[] = $temp;
}

これは、 と の数が等しいことを前提としてい$_POST['grades']ます。そうでない場合は、通知が発生するか、各値に対処しません。$_POST['types']undefined offset


Arun のコードに関して: 2 つのループをネストすると、N*M の内部ループ反復が作成されます。グレード/タイプの組み合わせごとに 1 つずつ、この場合は明らかに間違っています! 配列はペアの値を保持するために使用されるため、配列を並行して処理する必要があります。


@ジャック:私が間違っていなければ、配列定義でHONORSandを交換する必要があります。COLLEGE

于 2013-01-17T04:13:00.070 に答える
0

このソリューションは私にとってはうまくいきます

$array = array('ab', 'bc', 'cd', 'de');
$array = array_combine(range(1, count($array)), array_values($array));
print_r($array);
于 2021-02-11T07:27:32.270 に答える