Привет у меня есть массив 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;
Это не даст правильный результат. Есть ли в любом случае, чтобы убедиться, что результат всегда правильный.
Спасибо за любую помощь и предложения
Вот решение, которое я написал для вашего запроса, выбирая оценки, используя $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
П.С .: «Инженеринг» должен быть «Инжиниринг»
Я надеюсь, что я был полезным.
Ура!
Других решений пока нет …