PHP-尝试将数组项减少一个$array[$var-1]

PHP-尝试将数组项减少一个$array[$var-1],php,Php,我在弄清楚如何获取带有$variable-1的数组项时遇到了一些问题 我想做的是: 我一个月有很多天 $monthsArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 我有一个变量,它是月份 $monthOfDeparture = mb_substr($departureDate, 3, 4); 1月份的值为01等 我正试图在一个月前得到正确的答案 $theMonth = $monthsArray[$monthOfDepartu

我在弄清楚如何获取带有$variable-1的数组项时遇到了一些问题

我想做的是:

我一个月有很多天

$monthsArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
我有一个变量,它是月份

$monthOfDeparture = mb_substr($departureDate, 3, 4);
1月份的值为01等

我正试图在一个月前得到正确的答案

$theMonth = $monthsArray[$monthOfDeparture - 1]
我实际得到的是出发月份,即:3月31日,而不是2月28日,如果$monthoff出发=03

欢迎任何帮助

提供代码:注意,$arrivalDate和$departureDate看起来像23-02-21 dd-mm-yy

编辑

我的逻辑有错误。我想做的是:


// if the number of days in departure is greater then the number of days in arrival 
if( $departureDateNumber < $arrivalDateNumber) {
    //get the number of days in the month of arrival
    $arrNumTwo = $monthsArray[$monthOfArrival];
    //the user will stay: total number of days in arrival month - starting date of arrival + days in the next month
    $lodgingNights = $arrNumTwo - $arrivalDateNumber + $departureDateNumber; 
    $pay = $lodgingNights * $price_per_night;
}else{
    $lodgingNights = $departureDateNumber - $arrivalDateNumber;
    $pay = $lodgingNights * $price_per_night;
}
我现在遇到的问题是,我得到了通知:未定义索引:02-2在我的路径中的第$arrNumTwo=$monthsArray[$monthoffarrival];我猜这是因为代码段$monthhofarival=mb_substr$arrivalDate,3,4;虽然我不知道为什么不选第三和第四个字符

编辑nmb xy。
我发现我误解了substr的工作原理。需要使用$monthOfArrival=mb_subsr$arrivalDate,3,2

虽然这不是对您提出的问题的回答,但这可能是一个值得您深思的答案:

$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $theMonth, $year);
*您可能需要为$year执行+2000

。这给在闰年工作带来了额外的好处

或者,您可以使用我推荐的DateTime。Datetime在一开始似乎有点吓人,但它有很多特性,可以让你的生活更轻松。例如:

$arrival = DateTime::createFromFormat("d-m-y", $arrivalDate);
$departure = DateTime::createFromFormat("d-m-y", $departureDate);
您可以相互比较,例如如果$example<$arrival{},您可以更轻松地获得差异:

$diff = $arrival->diff($departure)->days;

请分享更多细节,比如帮助重现问题的示例代码'03'-1为2,数组中索引2处的值为31。你只需要-2,而不是-1。那么正确的月份应该是前一个月?是的,正确的月份应该是前一个月,因为数组从0开始,而不是1“因为数组从0开始,而不是1”-只要你愿意,就可以很容易地从不同的索引开始,通过显式指定第一项使用哪一项$monthsArray=[1=>31,28,31,…]将从1开始为整个内容编制索引。旁注:可以使用->天来代替->格式“%a”。谢谢您的回复。如果我不解决这个问题,我会尝试一下接受这个答案,因为大家都认为这是最好的方法。问题实际上是我的逻辑和对substr的错误理解。可能是关于堆栈溢出的重复建议。@WearedOmed我仍然建议您查看答案中我的日期时间部分。我可以向你保证这是值得的。如果不是现在,请在下次需要时:
$diff = $arrival->diff($departure)->days;