PHP有条理地组合数组

时间:2013-12-02 14:00:22

标签: php arrays

我正在循环显示当月的一系列天数,以生成当天或之后的另一个天数。我也在下个月做同样的事情(这将始终包括当前日期之后的所有日子)。

复杂性是指下个月与当月不同的一年。最终数组的格式如下:

array("year" => array("month" => array(days)));

当两个月都在同一年时,它可能如下所示:

$allDays = array("2013" => array( "11" => array(28,29,30), "12" => array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31)));

当2个月在不同年份(即12月和1月)时,它可能如下所示:

$allDays = array("2013" => array("12" => array(2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31)), "2014" => array("1" => array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31) )) ;

这是我的代码,它生成当月和下个月的日期列表:

// Set the default timezone
    date_default_timezone_set('Australia/Sydney');

    // Get days for current month
    $day = date("Y-m-d");
    $i = strtotime($day);

    array("year" => array("month" => array(days)));
    $linked_days = array(
        date('Y', $i) => array(
            date('m') => range(date('d', $i), intval(date('t'))),
        ),
    );

    // Get days for next month

    $day2 = date("Y-m-d", strtotime('first day of next month')) ;
    $i2 = strtotime($day2);

    array("year" => array("month" => array(days)));
    $linked_days2 = array(
        date('Y', $i2) => array(
            date('m') => range(date('d', $i2), intval(date('t'))),
        ),
    );

我不知道如果他们在同一年或不同的情况下如何将它们组合成具有不同sytanx的1阵列?

1 个答案:

答案 0 :(得分:1)

您可以使用isset函数检查数组中是否已有年份条目:

更改此

$day2 = date("Y-m-d", strtotime('first day of next month')) ;
$i2 = strtotime($day2);

array("year" => array("month" => array(days)));
$linked_days2 = array(
    date('Y', $i2) => array(
        date('m') => range(date('d', $i2), intval(date('t'))),
    ),
);

$day2 = date("Y-m-d", strtotime('first day of next month')) ;
$i2 = strtotime($day2);

array("year" => array("month" => array(days))); //useless line ??
if(!isset($linked_days[date('Y', $i2)])){
    //if no entry for this year in array, create new entry
    $linked_days[date('Y', $i2)] = array(date('m') => range(date('d', $i), intval(date('t'))));
}
else{
    //else, just add the month entry
    $linked_days[date('Y', $i2)][date('m')] = range(date('d', $i2), intval(date('t'))) ;
}