PHP多维数组:如果是子数组的最后一个,则增加键


PHP multidimensional array: increase key if last of sub-array

对于日历,我从数据库中读取开始日期和结束日期,dateRange函数为每个键创建一个有一天的数组,如下所示:

$total_dates[]=dateRange('2012-04-01','2012-04-05');
$total_dates[]=dateRange('2012-04-06','2012-04-09');
$total_dates[]=dateRange('2012-04-10','2012-04-15');
$total_dates[]=dateRange('2012-04-17','2012-04-21');
$total_dates[]=dateRange('2012-04-24','2012-04-28');

将输出:

Array (
[0] => Array ( [0] => 2012-04-01 [1] => 2012-04-02 [2] => 2012-04-03 [3] => 2012-04-04 [4] => 2012-04-05 )
[1] => Array ( [0] => 2012-04-06 [1] => 2012-04-07 [2] => 2012-04-08 [3] => 2012-04-09 )
[2] => Array ( [0] => 2012-04-10 [1] => 2012-04-11 [2] => 2012-04-12 [3] => 2012-04-13 [4] => 2012-04-14 [5] => 2012-04-15 )
[3] => Array ( [0] => 2012-04-17 [1] => 2012-04-18 [2] => 2012-04-19 [3] => 2012-04-20 [4] => 2012-04-21 )
[4] => Array ( [0] => 2012-04-24 [1] => 2012-04-25 [2] => 2012-04-26 [3] => 2012-04-27 [4] => 2012-04-28 )
)

现在,它应该在数组中包含的日期输出不可用,而在空闲日期输出可用。每天只能有一个预订(现在,稍后我还需要像上午和下午一样执行,所以这将在那时交叉)。

逻辑是从第一天到最后一天。如果不是,则无回声,如果是,则检查是否是此日期的最后一天Range,如果是的,则增加子数组的键。。。

这是代码,但如果它是最后一个键,则不会增加键。。。

reset($total_dates);
$array_i=0;

for ($i=1;$i<=$this_maxdays_month;$i++) {
if($i<10) {$i2="0".$i;} else {$i2=$i;} //if $i is 1-9, add a leading zero
if($i==1) {$month_begin=date('M',$this_date)." ";} else {$month_begin="";} //if 1st of month add e.g. Jan
if($total_dates[$array_i]) {
    if (in_array("$year-month-$i2",$total_dates[$array_i])) {
        echo "not available";
                // now check if the last key in date range, if yes, increase key -> does not work!
        if (key(array_slice($total_dates[$array_i], -1, 1, TRUE))+1==$i) {$array_i++;}
       }
    else {
        echo "available";
       }       
    }
}

附言:我也试过:

$count_max_array_keys=count($total_dates[$array_i])+1;
if (!array_key_exists($count_max_array_keys,$total_dates[$array_i])) {$array_i++;}

并使用+1(如在第一个示例中)。。。

有人知道我在这里错过了什么吗??

提前谢谢!


UPDATE:它应该输出(稍后在日历视图中构建),如:

1st April 2012: booked
2nd April 2012: booked
3rd April 2012: booked (this is the last date of this dateRange, so increase key)
4th April 2012: (not in array anymore) available
5th April 2012: available
6th April 2012: (is in the next dateRange) booked
...

希望现在更清楚,thx!


更新2:如果我在与之前的array_slice完全相同的地方使用if ( (count($total_dates[$array_i])-1)+1==$i) {$array_i++;},则会发生以下情况:

row-number    $array_i    output of the count-statement
1: 0    4
2: 0    4
3: 0    4
4: 0    4
5: 1    3 (this is the last key, but here $array_i should still be 0, as the increase happens after the output, and why is suddenly count only 3?)
6-30: 1     3 (it never increases again)

我知道我没有完整的代码,所以我对它进行了大量重写,使它能够单独执行。我希望这将帮助你找到问题的答案。

<?php
$total_dates = array();
$total_dates[]=array('2012-04-01','2012-04-02','2012-04-03','2012-04-04','2012-04-05');
$total_dates[]=array('2012-04-24','2012-04-25','2012-04-26','2012-04-27');
$this_maxdays_month = 30;
$year = "2012";
$month = "04";
function date_is_first_in_set($date, $total_dates)
{
    $ret = false;
    for($i = 0; $i < count($total_dates); $i++)
    {
        if($date == $total_dates[$i][0])
        {
            $ret = true;
            break;
        }
    }
    return $ret;
}
function date_is_last_in_set($date, $total_dates)
{
    $ret = false;
    for($i = 0; $i < count($total_dates); $i++)
    {
        if($date == end($total_dates[$i]))
        {
            $ret = true;
            break;
        }
    }
    return $ret;
}
function date_available($date, $total_dates)
{
    $ret = true;
    for($i = 0; $i < count($total_dates); $i++)
    {
        if(in_array($date, $total_dates[$i]))
        {
            $ret = false;
            break;
        }
    }
    return $ret;
}
for($i = 1; $i <= $this_maxdays_month; $i++)
{
    $date = $year.'-'.$month.'-'.str_pad($i, 2, '0', STR_PAD_LEFT);
    echo $date.': ';
    if(date_available($date, $total_dates))
    {
        echo 'available';
    }
    else
    {
        echo 'unavailable';
    }
    if(date_is_first_in_set($date, $total_dates))
    {
        echo ' FIRST!';
    }
    if(date_is_last_in_set($date, $total_dates))
    {
        echo ' LAST!';
    }
    echo "<br>'n";
}
?>

其输出为:

2012-04-01: unavailable FIRST!
2012-04-02: unavailable
2012-04-03: unavailable
2012-04-04: unavailable
2012-04-05: unavailable LAST!
2012-04-06: available
2012-04-07: available
2012-04-08: available
2012-04-09: available
2012-04-10: available
2012-04-11: available
2012-04-12: available
2012-04-13: available
2012-04-14: available
2012-04-15: available
2012-04-16: available
2012-04-17: available
2012-04-18: available
2012-04-19: available
2012-04-20: available
2012-04-21: available
2012-04-22: available
2012-04-23: available
2012-04-24: unavailable FIRST!
2012-04-25: unavailable
2012-04-26: unavailable
2012-04-27: unavailable LAST!
2012-04-28: available
2012-04-29: available
2012-04-30: available