【问题标题】:PHP multidimensional array: increase key if last of sub-arrayPHP多维数组:如果子数组的最后一个则增加键
【发布时间】:2012-03-20 18:42:32
【问题描述】:

对于日历,我从数据库中读取开始日期和结束日期,然后 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 )
)

现在它应该在包含在数组中并且在空闲日期可用的那些日期输出不可用。每天只能预约一次(目前,我以后也需要像早上和下午一样实现,所以这会交叉)。

逻辑是从第一天到最后一天。如果不是,echo free,如果是,检查是否是这个dateRange的最后一天,如果是,增加子数组的key...

这里是代码,但是如果是最后一个key就不会增加key...

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";

       }       
    }
}

PS:我也试过了:

$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(如第一个示例)...

...有人知道我在这里缺少什么吗??

提前谢谢你!


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

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
...

希望现在更清楚了,谢谢!


更新 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)

【问题讨论】:

  • 您在这里的实际目标是什么?当您应该使用锤子(MySQL 或任何您的数据库引擎)时,您似乎正在尝试使用螺丝刀 (PHP)。
  • 我的目标是输出一个日历。我有一张带预订的桌子,日历是用 php 构建的...
  • 另外,我的数据库里只有开始日期和结束日期
  • 你的代码让我很困惑。我认为您在array_splice 上犯了一些错误。如果你能做出一些你认为应该如何的模拟输出会有所帮助,这样我就可以确定使用什么方法。
  • $他们有这么多日历应用程序......如果你愿意,我可以推荐一个更简单的版本,可以与你的日期数据库一起使用

标签: php arrays multidimensional-array array-key


【解决方案1】:

我知道我没有您的完整代码,所以我重度重写了它,以便它可以独立执行。我希望这将帮助您找到问题的答案。

<?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

【讨论】:

  • 谢谢你,JMack,这看起来很棒,但不幸的是它不起作用,这意味着直到第 5 行它什么都不做,但在那之后它甚至没有为 array_i 回显 0...奇怪..跨度>
  • 好吧,JMack,我可以简单地尝试计算并增加主数组而不是子数组的键吗?主数组包含5个子数组,所以是正确的,如果输出5但不增加...
  • 我认为问题在于我仍然理解您的逻辑错误。我根据我认为你试图用那条拼接线做的事情做了一个猜测,但我可能弄错了。
  • 哦,也许我也不再理解我的逻辑了......但我有一个包含子数组的数组。每个子数组包含一个 dateRange,每一天作为一个键值。如果我在这个子数组的最后一个键(最后一天),我想去下一个子数组,从那里的第一天开始......
  • 好的,我最后一次尝试,然后我得走了。现在更新。
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2011-09-20
  • 2012-12-12
相关资源
最近更新 更多