PHP многомерный массив: увеличить ключ, если последний из под-массива - PullRequest
2 голосов
/ 20 марта 2012

Для календаря я считываю дату начала и дату окончания из базы данных, а функция 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 )
)

Теперь он должен выводить недоступно в те даты, которые включены в массив и доступны в свободные даты. На каждый день может быть ТОЛЬКО ОДНО резервирование (сейчас, позже, мне также нужно будет сделать это как утром и днем, так что тогда это будет пересекаться).

Логика заключалась в том, чтобы перейти от первого дня к последнему дню. Если нет, то без эха, если да, проверьте, был ли это последний день этого dateRange, если да, увеличьте ключ подмассива ...

Вот код, но он не увеличивает ключ, если это последний ключ ...

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: если я использую if ( (count($total_dates[$array_i])-1)+1==$i) {$array_i++;} в том же месте, что и array_slice, происходит следующее:

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)

1 Ответ

1 голос
/ 20 марта 2012

Я знаю, что у меня нет вашего полного кода, поэтому я сильно переписал его, чтобы он выполнялся отдельно.Я надеюсь, что это поможет вам найти ответ на ваш вопрос.

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