PHP 来自数组的交叉表格式

PHP crosstab formatting from array

嗨,我有一个像这样的 PHP 数组

$table=array();
$subject_names=array();

$subject_names[118]="English";
$subject_names[108]="Software Engeneering";

$table['Josh'][118]['int'] =55;
$table['Josh'][118]['ext'] = 10;
$table['Josh'][108]['int'] =45;
$table['Josh'][108]['ext'] = 12;

$table['Matt'][118]['int'] =45;
$table['Matt'][118]['ext'] = 12;
$table['Matt'][108]['int'] =50;
$table['Matt'][108]['ext'] = 15;

这里118和108是subject_id我想这样格式化

    student |       English           |   Software Engeneering |
            | int. mark | ext. mark   | int. mark | ext. mark  |
    ___________________________________________________________
    Josh    | 55        | 10          | 45        | 12
    Matt    | 45        | 12          | 50        | 15

我试过了

echo "Student Name\t";

foreach($subject_names as $sub_name)
{
    echo "$sub_name\t";
}
echo "<br>";    

foreach($table as $sname => $subjects){

    echo "$sname\t";

    foreach($subjects as $subject_name => $types)
    {
        foreach($types as $marks)
        {
            echo "$marks\t";
        }
    }
    echo "<br>";

}

它工作正常,但是如果我改变 table 的数组项的位置,比如

$table['Josh'][118]['int'] =55;
$table['Josh'][108]['int'] =45;
$table['Josh'][118]['ext'] = 10;
$table['Josh'][108]['ext'] = 12;

它不会给出正确的结果。有没有办法保证结果总是正确的

感谢您的帮助和建议

这是我为您的要求编写的解决方案,使用 $subject_names 选择分数作为控制而不是学生的分数表(我希望您在阅读代码后明白我的意思)...

$table=array();
$subject_names=array();

// notice that I switched subject order, just to show that subjects control the marks displayed thereby ensuring consistent score mapping
$subject_names[108]="Software Engeneering";
$subject_names[118]="English";

// and I'm using the rearranged scores (the sample use-case you specified in the question that distorts your output)
$table['Josh'][118]['int'] =55;
$table['Josh'][108]['int'] =45;
$table['Josh'][118]['ext'] = 10;
$table['Josh'][108]['ext'] = 12;

$table['Matt'][118]['int'] =45;
$table['Matt'][118]['ext'] = 12;
$table['Matt'][108]['int'] =50;
$table['Matt'][108]['ext'] = 15;

echo "Student Name\t";

foreach($subject_names as $sub_name)
{
    echo "$sub_name\t";
}
echo "\n";

// proposed solution:
foreach($table as $sname => $subjects){

    echo "$sname\t";

    foreach ($subject_names as $subject_id => $name) {

        foreach ($subjects[$subject_id] as $mark) {
            echo "$mark\t";
        }
    }
    echo "\n";

}

这是上面脚本的输出...

Student Name    Software Engeneering    English 
Josh    45  12  55  10  
Matt    50  15  45  12  

运行 通过问题中提供的脚本获取相同的数据,这是输出(失真)...

Student Name    Software Engeneering    English
Josh    55  10  45  12
Matt    45  12  50  15

P.S: 'Engeneering' 应该是 'Engineering'

希望对您有所帮助。 干杯!