Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中创建此数组?_Php_Arrays_Foreach - Fatal编程技术网

如何在PHP中创建此数组?

如何在PHP中创建此数组?,php,arrays,foreach,Php,Arrays,Foreach,我有一个来自数据库的查询,它返回一个值数组,并将其放入$history array。 每个值都有课程id、单位id和时间戳 我想要另一个带有课程id和相应单元id的数组 课程id必须有最新的时间戳,每个单元id必须有自己的时间戳 它还需要在每个课程中最多有4个单元array (幸运的是,DB中的$history数组已经是按时间顺序\u stamp DESC,所以我想我只需要获取课程的第一个时间戳以及每个课程的前4个单元) 所以我需要的是: courseListArray: array[0]:

我有一个来自数据库的查询,它返回一个值数组,并将其放入
$history array
。 每个值都有
课程id
单位id
时间戳

我想要另一个带有
课程id
和相应
单元id
的数组

课程id
必须有最新的
时间戳
,每个
单元id
必须有自己的
时间戳

它还需要在每个课程中最多有4个单元
array

(幸运的是,DB中的
$history
数组已经是
按时间顺序\u stamp DESC
,所以我想我只需要获取课程的第一个
时间戳以及每个课程的前4个单元)

所以我需要的是:

courseListArray:
  array[0]:
  course_id: closest time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
  array[1]:
  course_id: closest time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
    unit_id: time_stamp
下面是DB查询的示例:

array(6) { ["course_id"]=> string(4) "2968" [0]=> string(4) "2968" ["unit_id"]=> string(4) "3002" [1]=> string(4) "3002" ["time_stamp"]=> string(26) "2016-06-10 14:54:11.000000" [2]=> string(26) "2016-06-10 14:54:11.000000" } 

array(6) { ["course_id"]=> string(4) "2968" [0]=> string(4) "2968" ["unit_id"]=> string(4) "3006" [1]=> string(4) "3006" ["time_stamp"]=> string(26) "2016-06-10 14:41:54.000000" [2]=> string(26) "2016-06-10 14:41:54.000000" } 

array(6) { ["course_id"]=> string(4) "2740" [0]=> string(4) "2740" ["unit_id"]=> string(4) "2982" [1]=> string(4) "2982" ["time_stamp"]=> string(26) "2016-06-10 13:20:01.000000" [2]=> string(26) "2016-06-10 13:20:01.000000" } 

array(6) { ["course_id"]=> string(4) "3017" [0]=> string(4) "3017" ["unit_id"]=> string(4) "3012" [1]=> string(4) "3012" ["time_stamp"]=> string(26) "2016-06-10 13:12:19.000000" [2]=> string(26) "2016-06-10 13:12:19.000000" } 
我尝试了下面的代码,但没有按预期工作,因为
数组键
填充不正确

foreach ($history as $data) {
    if (!array_key_exists($data['course_id'], $courseList)) {
        array_push($courseList, $data['course_id']);
        $courseList[$data['course_id']] = array();
    }

    if (count($courseList[$data['course_id']]) <= 4) {
        array_push($courseList[$data['course_id']], $data['unit_id']);
    }
}
foreach($history as$data){
如果(!array_key_存在($data['course_id',$courseList)){
数组推送($courseList,$data['course\u id']);
$courseList[$data['course_id']]=array();
}
如果(count($courseList[$data['course\u id']])得到它:

foreach ($history as $data) {
    if (!array_key_exists('course'.$data['course_id'], $courseList)) {
        array_push($courseList, $data['course_id']);

        $courseList['course'.$data['course_id']] = array();
        $courseList['course'.$data['course_id']]['units'] = array();
        $courseList['course'.$data['course_id']]['course'] = [$data['course_id'] => $data['time_stamp']];
    }

    if (count($courseList['course'.$data['course_id']]['units']) <= 4) {
        array_push($courseList['course'.$data['course_id']]['units'], [$data['unit_id'] => $data['time_stamp']]);
    }
}

foreach ($courseList as $key => $course) {
    if (!is_numeric($key)) {
        var_dump($course);
        echo '<BR><BR>';
    }
}
编辑:


Barmar的答案要好得多。

你把索引数组和关联数组混在一起了。你应该把
$course\u array
做成一个关联数组,它的键是
course\u id
。然后这个值应该是一个子数组,包含该course id的所有行

foreach ($history as $data) {
    $cid = $data['course_id'];
    if (!isset($courseArray[$cid])) {
        $courseArray[$cid] = array();
    }
    $courseArray[$cid][$data['unit_id']] = $data['time_stamp'];
}

$courseList
应该是索引数组还是关联数组?
array\u push
用于索引数组,但
$courseList[$data['course\u id']]
将其作为关联数组访问。您的图表看起来像一个索引数组。同一数组中不能有多个
unit\u id
键,因为数组键必须是唯一的。您应该将
unit\u id
设为数组。在关联数组上使用
array\u push
,犯的错误与问题相同。@Barmar,为什么我不能在这里做吗?@Barmar,我想我需要这样做,因为我没有任何其他参数(据我所知),以检查
课程id
是否已经存在。谢谢Barmar。我对PHP不太了解。您是否介意告诉我如何将
单元id
作为键和
时间戳
数组中的值放置在
单元
数组中,就像您使用
课程时间戳一样?
我尝试过:
$courseArray[$cid]['units][]=数组($data['unit\u id']=>$data['time\u stamp']);
但它给我一个索引:
array(2){[“time\u stamp”]=>string(26)“2016-06-1014:54:11.000000”[“units”]=>array(2){[0]=>array(1){[3006]=>string(26)“2016-06-1014:54:11.000000”}[1]=>array(1){[3006]=>string(26)“2016-06-1014:41}
我已经更改了答案。我真不敢相信你怎么让它看起来这么简单。我想我只需要多练习。非常感谢!
foreach ($history as $data) {
    $cid = $data['course_id'];
    if (!isset($courseArray[$cid])) {
        $courseArray[$cid] = array();
    }
    $courseArray[$cid][$data['unit_id']] = $data['time_stamp'];
}