PHP кросс-таблица форматирования из массива

Привет у меня есть массив 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['Josh'][118]['int'] =55;
$table['Josh'][108]['int'] =45;
$table['Josh'][118]['ext'] = 10;
$table['Josh'][108]['ext'] = 12;

Это не даст правильный результат. Есть ли в любом случае, чтобы убедиться, что результат всегда правильный.

Спасибо за любую помощь и предложения

1

Решение

Вот решение, которое я написал для вашего запроса, выбирая оценки, используя $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

П.С .: «Инженеринг» должен быть «Инжиниринг»

Я надеюсь, что я был полезным.
Ура!

0

Другие решения

Других решений пока нет …