foreach()在数组中跳过第一个元素

4
尝试创建一个GPA计算器。我有一个表单提交到一个php文件,然后将表单中的所有数据存储在php数组()中。这个计算器非常好用,直到我输入相同的值。我认为除非我展示一些图片,否则这没有意义:
这是一个图片说明问题:

Error Scenario

Correct Scenario

在第一张图片中,我输入了一个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()...我只需要确保 与相关联。
感谢您的帮助!

也许输出 $_POST 的内容会有所帮助。 - Ja͢ck
我认为数组合并是问题所在。第一个数组可能包含相同的成绩,因此它将被丢弃。 - Arun Killu
尝试过了,得到了'grades[]'的数组(5) { [0]=> string(1) "A" [1]=> string(1) "A" [2]=> string(1) "0" [3]=> string(1) "0" [4]=> string(1) "0" }和'types[]'的数组(5) { [0]=> string(7) "REGULAR" [1]=> string(7) "REGULAR" [2]=> string(1) "0" [3]=> string(1) "0" [4]=> string(1) "0" }。 - Wp3Dev
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']];
}

我以前从未做过这个,但它看起来更好... 我尝试了一下,在 $gradeScores[] 上使用 var_dump(),但在 var_dump() 中得到了 NULL 值。 - Wp3Dev
@cipherous 发现我忘记在构造函数中添加一个标志了;现在应该可以工作了。 - Ja͢ck

1
看看这个数组并输出成为结果数组的键的值"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;
        }
    }

}

所以我猜不要使用array_combine()... 我该如何解决这个问题? - Wp3Dev
1
笛卡尔积肯定会给出错误的结果。 - Ja͢ck
1
修改后的代码应该在两个数组索引相同时运行。去掉了-1。 - Ja͢ck

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:如果我没记错的话,你需要在数组定义中交换HONORSCOLLEGE


如果您想在另一个答案上留下评论,应该使用“添加评论”功能,而不是更新您的答案 :) - Ja͢ck

0

这个解决方案对我来说很好用

$array = array('ab', 'bc', 'cd', 'de');
$array = array_combine(range(1, count($array)), array_values($array));
print_r($array);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接