如何将一个数组添加到另一个数组中,使其成为二维数组?

3

我从数据库中检索数据,这些数据包含多行"学期"、"时间表ID"、"课程ID"、"课程名称"、"教师名称"、"日期"、"开始时间"、"结束时间"、"地点"


当我获取到这些数据后,我想按"学期"对它们进行分组。


例如,我从数据库中获取了以下数据:

Array
(
    [0] => Array
        (
            [Semester] => Semester 1, 2015
            [TimeTableID] => 11
            [SubjectID] => CSCI2203
            [SubjectName] => VISUAL PROGRAMMING
            [FacultyName] => NAME 0
            [Day] => Tue&Thu
            [StartTime] => 10:15:00
            [EndTime] => 12:00:00
            [Location] => C4
        )

    [1] => Array
        (
            [Semester] => Semester 1, 2015
            [TimeTableID] => 12
            [SubjectID] => CSCI2903
            [SubjectName] => FUNDAMENTALS OF NETWORKING
            [FacultyName] => NAME 1
            [Day] => Fri
            [StartTime] => 10:15:00
            [EndTime] => 12:00:00
            [Location] => C13
        )

    [2] => Array
        (
            [Semester] => Semester 1, 2015
            [TimeTableID] => 10
            [SubjectID] => CSCI2003
            [SubjectName] => DATA STRUCTURES
            [FacultyName] => NAME 2
            [Day] => Mon&Wed
            [StartTime] => 10:15:00
            [EndTime] => 12:00:00
            [Location] => C6
        )

    [3] => Array
        (
            [Semester] => Semester 2, 2015
            [TimeTableID] => 5
            [SubjectID] => CSCI2903
            [SubjectName] => FUNDAMENTALS OF NETWORKING
            [FacultyName] => NAME 3
            [Day] => Fri
            [StartTime] => 08:00:00
            [EndTime] => 09:45:00
            [Location] => LH3
        )

    [4] => Array
        (
            [Semester] => Semester 2, 2015
            [TimeTableID] => 3
            [SubjectID] => CSCI3003
            [SubjectName] => INTRODUCTION TO SOFTWARE ENGINEERING
            [FacultyName] => NAME 1
            [Day] => Mon&Wed
            [StartTime] => 08:00:00
            [EndTime] => 09:45:00
            [Location] => C12
        )
)

我希望按照"学期"对它们进行分组,就像这样:

Array
(
    [Semester 1, 2015] => Array
        (
            [0] => Semester 1, 2015
            [1] => 11
            [2] => CSCI2203
            [3] => VISUAL PROGRAMMING
            [4] => NAME 0
            [5] => Tue&Thu
            [6] => 10:15:00
            [7] => 12:00:00
            [8] => C4
            [9] => Semester 1, 2015
            [10] => 12
            [11] => CSCI2903
            [12] => FUNDAMENTALS OF NETWORKING
            [13] => NAME 1
            [14] => Fri
            [15] => 10:15:00
            [16] => 12:00:00
            [17] => C13
            [18] => Semester 1, 2015
            [19] => 10
            [20] => CSCI2003
            [21] => DATA STRUCTURES
            [22] => NAME 2
            [23] => Mon&Wed
            [24] => 10:15:00
            [25] => 12:00:00
            [26] => C6
        )

    [Semester 2, 2015] => Array
        (
            [0] => Semester 2, 2015
            [1] => 5
            [2] => CSCI2903
            [3] => FUNDAMENTALS OF NETWORKING
            [4] => NAME 3
            [5] => Fri
            [6] => 08:00:00
            [7] => 09:45:00
            [8] => LH3
            [9] => Semester 2, 2015
            [10] => 3
            [11] => CSCI3003
            [12] => INTRODUCTION TO SOFTWARE ENGINEERING
            [13] => NAME 1
            [14] => Mon&Wed
            [15] => 08:00:00
            [16] => 09:45:00
            [17] => C12
        )
)

到目前为止,这是我所拥有的:

$Semester = array();
$dataKey = array("Semester", "TimeTableID", "SubjectID", "SubjectName", "FacultyName", "Day", "StartTime", "EndTime", "Location");
for($i = 0; $i < count($Record); $i++)
{
    if(!in_array($Record[$i]['Semester'], $Semester))
    {
        $Semester[$Record[$i]['Semester']] = $Record[$i]['Semester'];
    }
    for($j = 0; $j < count($dataKey); $j++)
    {
        $Semester[$Record[$i]['Semester']] = $Record[$i][$dataKey[$j]];
    }
}
print_r($Semester);


$Record 是从数据库检索出的数据数组。但是这段代码只会给我最后一个值(即 location):

Array
(
    [Semester 1, 2015] => C6
    [Semester 2, 2015] => C12
)

$Semester[$Record[$i]['Semester']][] - aldrin27
你可以使用 array_values 来获取数组的所有值,而不是循环遍历 $dataKey 数组。并且使用 array_merge 来连接数组。 - Barmar
是的,@Barmar 是正确的。如果你想让代码行数少一些。 - aldrin27
除了@Chris,如果你想的话也可以重新排列数组。对我来说,我总是使用foreach来组织结果数组。 - aldrin27
我不确定为什么你想要子目录以那种方式排序。索引数组应该用于统一的数据,而异构集合应该使用关联数组。 - Barmar
为什么不将每个学期都设为一个关联数组的集合,而不是像那样将所有值连接成一个无序混乱的字符串? - Barmar
2个回答

3
您可以遍历这个数组并重新排列。我会将每个学期存储为一个数组的数组。就像这样:
$organized = array();

foreach( $resultsFromDB as $row )
{
    if( ! isset($organized[$row['Semester']]) ) {
        $organized[$row['Semester']] = array($row);
    }else {
        $organized[$row['Semester']][] = $row;
    }
}

print_r($organized);

唯一需要担心的是学期字符串中的逗号 (,)。作为数组索引可能会出现问题。在将学期设置为索引之前,您可以始终使用 str_replace() 进行替换。


0

你可以使用 array_values 将关联数组转换为索引数组。而且你可以使用 array_merge 来连接索引数组。

foreach ($Record as $r)
{
    $s = $r['Semester'];
    if(!in_array($s, $Semester))
    {
        // Get just the values without the keys
        $Semester[$s] = array_values($r);
    } else {
        // Concatenate this record to the sub-array 
        $Semester[$s] = array_merge($Semester[$s], array_values($r));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接