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

Php foreach()跳过数组中的第一个元素,php,html,Php,Html,正在尝试创建GPA计算器。我有一个表单,它提交到一个php文件,然后将表单中的所有数据存储在一个php数组()中。在我输入相同的值之前,计算器工作得很好。在我展示一些图片之前,我认为这是没有意义的: 以下是图像中的问题: 因此,在第一个图像中,我输入一个a,然后输入另一个a,当使用var_dump()时,它输出数组(1){[0]=>float(4.5)} 在第二幅图中,var_dump()是数组(2){[0]=>float(4)=>float(3.5)} 它正在跳过第一个图像中的第一行。。。

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

以下是图像中的问题:

因此,在第一个图像中,我输入一个a,然后输入另一个a,当使用var_dump()时,它输出数组(1){[0]=>float(4.5)}

在第二幅图中,var_dump()是数组(2){[0]=>float(4)=>float(3.5)}

它正在跳过第一个图像中的第一行。。。以防万一,A的注册分数应该等于4.0,荣誉分数应该等于4.5。它可能是数组_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;
        }
    }


}
/$\u POST['grades']表示等级,$\u POST['types']表示类型(注册、荣誉)
foreach(数组_组合($_POST['grades'],$_POST['types'])为$code=>$count)
{
如果($code==“A”)
{
如果($count==“常规”)
{
$GradeArray[]=4.0;
}
否则如果($count==“荣誉”)
{
$GradeArray[]=4.5;
}
否则,如果($count==“学院”)
{
$GradeArray[]=5.0;
}
}
否则如果($code==“B”)
{
如果($count==“常规”)
{
$GradeArray[]=3.0;
}
否则如果($count==“荣誉”)
{
$GradeArray[]=3.5;
}
否则,如果($count==“学院”)
{
$GradeArray[]=4.0;
}
}
否则如果($code==“C”)
{
如果($count==“常规”)
{
$GradeArray[]=2.0;
}
否则如果($count==“荣誉”)
{
$GradeArray[]=2.5;
}
否则,如果($count==“学院”)
{
$GradeArray[]=3.0;
}
}
否则如果($code==“D”)
{
如果($count==“常规”)
{
$GradeArray[]=1.0;
}
否则如果($count==“荣誉”)
{
$GradeArray[]=1.5;
}
否则,如果($count==“学院”)
{
$GradeArray[]=2.0;
}
}
否则如果($code==“F”)
{
如果($count==“常规”)
{
$GradeArray[]=0.0;
}
否则如果($count==“荣誉”)
{
$GradeArray[]=0.5;
}
否则,如果($count==“学院”)
{
$GradeArray[]=1.0;
}
}
}
可能是整个foreach()语句需要修改。。。如果有人这么说的话,我可以再写一次逻辑了

我不想用代码把问题塞住,所以如果你绝对需要html,请提问,我会添加一个编辑

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


谢谢你的帮助

查看该数组,并输出值“a”,该值成为结果数组的键, 因此,如果您希望完整数组与第一个数组的键组合,那么第一个数组必须具有唯一值

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

如果要迭代两个数组(或更多),可以考虑使用;它不会像
array\u 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']];
}

我同意阿伦的行为原因。一个可能的解决办法是:

$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;
}
$lookup=Array(“A”=>4,“B”=>3,“C”=>2,“D”=>1,“F”=>0);

对于($i=0;$i此解决方案对我很有效

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

可能一堆
$\u POST
会有帮助。我认为数组合并是问题所在,第一个数组可能包含相同的等级,因此它将被丢弃。尝试得到数组(5){[0]=>string(1)“a”[1]=>string(1)“a”[2]=>string(1)“0”[3]=>string(1)“0”[4]=>string(1)“0”}表示“等级[]”和数组(5){[0]=>string(7)“常规”[1]=>string(7)“常规”[2]=>string(1)“0”[3]=>string(1)“0”[4]=>string(1)“0”}用于“类型[]”,所以我猜不要使用数组…我应该如何解决这个问题?-1.笛卡尔积肯定会给出错误的结果。如果两个数组索引相同,则修改后的代码应该可以工作。删除了-1。我以前从未这样做过,但它看起来更好…我尝试过并在$gradeScores[]上使用var dump,但在var_dump()中得到空值@cipherous意识到我忘了向构造函数添加标志;它现在应该可以工作了。如果你想对另一个答案留下评论,你应该使用“添加评论”功能,而不是更新你的答案:)
$array = array('ab', 'bc', 'cd', 'de');
$array = array_combine(range(1, count($array)), array_values($array));
print_r($array);