trying to put together a 3-tiered array of term, class, students for a waitlist clearing page. Here is the foreach I am using to create the array, but something is not right. The resulting array isn't right for looping through and making an html table of term > course >student. My foreach looks like this
foreach ($active_terms as $term) {
$waitlists[ $term['term_id'] ] = $term;
foreach ($active_courses as $course) {
if ( ($course['term_id'] == $term['term_id']) && ($course['students_waitlisted'] > 0) ) {
$waitlists[ $term['term_id'] ][ $course['course_id'] ] = $course;
foreach ($waitlisted_reservations as $reservation) {
if ( ($term['term_id'] == $reservation['term_id'])
&& ($course['course_id'] == $reservation['course_id']) ) {
$waitlists[ $term['term_id'] ][ $course['course_id'] ][ $reservation['reservation_id'] ] = $reservation;
}
}
}
}
}
and the resulting array is close, but looks like this:
Array
(
[1] => Array
(
[term_id] => 1
[term_title] => Summer Session 1
[term_begin_date] => June 25 2012
[3] => Array
(
[term_id] => 1
[course_id] => 3
[course_title] => Biology 1
[course_student_limit] => 8
[students_reserved] => 6
[students_registered] => 0
[students_waitlisted] => 3
[175] => Array
(
[term_id] => 1
[course_id] => 3
[reservation_id] => 175
[reservation_grade_level] => 12
[student_sis_id] => 289055
)
[173] => Array
(
[term_id] => 1
[course_id] => 3
[reservation_id] => 173
[reservation_grade_level] => 08
[student_sis_id] => 111988
)
)
)
[2] => Array
(
[term_id] => 2
[application_id] => 2
[term_title] => Summer Session 2
[term_begin_date] => July 23 2012
[18] => Array
( ....
Could someone please point out how I can make the parent-child nest correctly? Or is this array correct, and I've messed up on how to do the nested foreach to build the table?
You have to introduce one more level. For instance, replace:
$waitlists[ $term['term_id'] ][ $course['course_id'] ] = $course;
With this:
$waitlists[ $term['term_id'] ]['courses'][ $course['course_id'] ] = $course;
Update
To keep yourself sane you can also use references in your foreach
, like:
foreach ($active_terms as $term) {
$waitlists[ $term['term_id'] ] = $term;
foreach ($active_courses as $course) {
if ( ($course['term_id'] == $term['term_id']) && ($course['students_waitlisted'] > 0) ) {
$waitlists[ $term['term_id'] ][ $course['course_id'] ] = $course;
Can also be written like:
foreach ($active_terms as $term) {
$waitlists[ $term['term_id'] ] = $term;
$current_courses = &$waitlists[ $term['term_id'] ]['courses'];
foreach ($active_courses as $course) {
if ( ($course['term_id'] == $term['term_id']) && ($course['students_waitlisted'] > 0) ) {
$current_courses[ $course['course_id'] ] = $course;
To shorten the variable names. You can probably work out the rest from there :)