4

尝试创建 GPA 计算器。我有一个提交到 php 文件的表单,然后将表单中的所有数据存储在 php array() 中。计算器运行良好,直到我输入相同的值。在我展示一些图片之前,我认为这没有意义:

这是图像中的问题:

错误场景

正确的场景

因此,在第一张图片中,我输入了一个 A,然后是另一个 A,它在使用 var_dump() 时输出 array(1) { [0]=> float(4.5) }

在第二张图片中, 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,只需询问,我将添加编辑。

编辑:我也在想我需要重写逻辑......我以前从未使用过array_combine()......我只需要确保与相关的对应

谢谢您的帮助!

4

4 回答 4

3

如果您想遍历两个数组(或更多),您可以考虑使用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

我同意 Arun 关于这种行为的原因。一个可能的解决方案是:

$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 的代码:嵌套两个循环将创建 N*M 内部循环迭代 - 每个等级/类型组合一个,在这种情况下显然是错误的!我们需要并行遍历数组,因为它们用于保存对值。


@Jack:如果我没记错的话,你需要在你的数组定义中交换HONORS和。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 回答