构建分层多维数组,其中包含年份范围内的所有年、月、日和小时值

问题描述 投票:0回答:2

我正在尝试创建一个年、月、日、小时的多维数组,以便我可以每小时跟踪某些数据。我试图通过嵌套 for 循环初始化这个数组,但似乎失败得很惨。

$Year = array();

//This starts in 2015 and works until 2018
for($z=0; $z < 3; ++$z)
{
    $Month = array();
    array_push($Year, $Month);

    //Months
    for($a=0; $a < 12; ++$a)
    {
        //Days
        for($b=0; $b < GetDaysInMonth($a); ++$b)
        {
            $Day = array();
            array_push($Month, $Day);

            //Hours
            for($c = 0; $c < 24; ++$c)
            {
                $Hours = array(0);
                array_push($Day, $Hours);
            }
        }
    }
}

目标是初始化一个大小为 24 的数组(表示小时),将其推入表示天的数组,将天数组推入月份,将月份数组推入年份。但每次我尝试访问数据时,它似乎都不存在。我在这里做错了什么?

php arrays multidimensional-array hierarchical-data date-range
2个回答
3
投票

每次

array_push
之后,您必须
for

$Years = array();
//This starts in 2015 and works until 2018
for($z=0; $z < 3; $z++) {
    $Year = array();
    //Months
    for($a=0; $a < 12; $a++) {
        $Month = array();
        //Days
        for($b=0; $b < GetDaysInMonth($a); $b++) {
            $Day = array();
            //Hours
            for($c = 0; $c < 24; $c++) {
                $Hours = $c;
                array_push($Day, $Hours); // push Hours into Day
            }
            array_push($Month, $Day); // push Days into Month
        }
        array_push($Year, $Month); // push Months into Year
    }
    array_push($Years, $Year); // push each Year in a var with all Years
}

编辑:我添加了一个名为

$Years
的变量来存储所有年份


0
投票

从 2015 年初到 2018 年全年,预计最深层有 35,064 个元素。这是相当大的内存消耗,您可能需要提高内存限制或更改策略。

至于生成带有索引级别的多维数组,您可以使用以下方法:(Demo

$start = 2015;
$end = 2018;
$years = [];
foreach (range($start, $end) as $y) {
    $months = [];
    for ($m = 1; $m <= 12; ++$m) {
        $lastDayOfMonth = date('t', strtotime("$y-$m-01"));
        $days = [];
        for ($d = 1; $d <= $lastDayOfMonth; ++$d) {
            $days[] = range(0, 23);
        }
        $months[] = $days;
    }
    $years[] = $months;
}
var_export($years);

如果这是我的任务,我可能会在所有级别上使用更直观的键,并利用日期时间对象并在日期时间段内循环。 (演示)

$period = new DatePeriod(
    new DateTime('2015-01-01'),
    new DateInterval('P1D'),
    new DateTime('2018-12-31'),
    DatePeriod::INCLUDE_END_DATE
);

$years = [];
foreach ($period as $date) {
    $years[$date->format('Y')][$date->format('m')][$date->format('d')] = range(0, 23);
}
var_export($years);
© www.soinside.com 2019 - 2024. All rights reserved.