带有嵌套索引的PHP“未定义索引”多维数组

时间:2014-03-31 01:12:55

标签: php arrays multidimensional-array

我实际上让这段代码运行得很好,但我做了一些事情,通过使用数组键使它看起来更干净和简洁。你可以看到我的第一个看起来是如何看起来像是$classes[$i+3]等等。它工作得很好,但我想让它更具可读性,一目了然。

这是错误消息:

  

注意:未定义的索引:第127行的C:\ xampp \ htdocs \ CreateaTranscript.php中的A       (“A”是“$ grade_conversion”数组中的一个键,它与计算用户GPA的十进制值有关。)

这是我用来实际工作的代码行:

$grade_points += $grade_conversion[$classes[$i+3]] * $classes[$i+2];

这是导致错误的代码行:

$grade_points += $grade_conversion[$course[$i]['grade']] * $course[$i]['credit_hours'];

我尝试将多维数组包含在内。但是,它只会创建一个阻止脚本运行的不同错误。我知道基本问题是编译器看到一个未包含在s中的数组键。但是,为什么它适用于普通数组而不是多维数组?

$grade_conversion=array(
    'A' => 4,
    'A-' => 3.7,
    'B+' => 3.3,
    'B' => 3.0,
    'B-' => 2.7,
    'C+' => 2.3,
    'C' => 2.0,
    'C-' => 1.7,
    'D+' => 1.3,
    'D' => 1,
    'D+' => 0.7,
    'F' => 0,
);

我试图保持这种简洁。是否可以按照我声明的方式使用索引?在我将其切换到多维数组之前,它工作正常。我将添加该行来自的for语句示例:

for($i = 0;$i < count($course);$i++){
print "<tr bgcolor = 'F8F8F8'><td>" . $course[$i]['course_id'] . "<td>" . $course[$i]['course_name'] . "</td><td>" . $course[$i]['credit_hours'] . "</td><td>" . $course[$i]['grade'] . "</td></tr>";

//Keep a running count of credit hours for the GPA equation.
//Keep a running total of grade points using the $grade_conversion array
$total_credit_hours += $course[$i]['credit_hours'];
$grade_points += $grade_conversion[$course[$i]['grade']] * $course[$i]['credit_hours'];

}

$ course数组是通过从文件中读取数据来创建的。

以下是如何创建$ course数组。数据逐行从数据文件中提取。

            $fh=fopen($file, "r");
        $j = 0;
        while (!feof($fh)){
                $course[$j]['course_id'] = fgets($fh);
                $course[$j]['course_name'] = fgets($fh);
                $course[$j]['credit_hours'] = fgets($fh);
                $course[$j]['grade'] = fgets($fh);
                $j++;
        }
        fclose($fh);

1 个答案:

答案 0 :(得分:2)

正如我在上面的评论中所提到的,由于fgets,您的值将包含一些空格字符。当您将它们存储在trim()数组中或将它们用作$course的索引时,您需要$grade_conversions这些。

您还可以避免在填充数组时手动指定数组索引,例如

while (!feof($fh)){
    $course[] = [
        'course_id' => trim(fgets($fh)),
        'course_name' => trim(fgets($fh)),
        'credit_hours' => trim(fgets($fh)),
        'grade' => trim(fgets($fh))
    ];
}

并迭代它

foreach ($course as $courseItem) {
    $total_credit_hours += $courseItem['credit_hours'];
    // etc
}

最后,我认为任何结构化文本格式(JSON,XML,CSV)都会比没有键控的换行符分隔值更好,例如

// file.json
[{
    "id": 1,
    "name": "Foo",
    "credit_hours": 2,
    "grade": "A"
},
{
    "id": 2,
    "name": "Bar",
    "credit_hours": 14,
    "grade": "B"
}]

并加载它......

$courses = json_decode(file_get_contents('file.json'), true);