如何从数组中获得比目标小的值

时间:2019-06-20 07:19:04

标签: php

每当有人取消预订时,我都试图将资金退还给客户。由于我根据取消时间有不同的退款百分比,因此请考虑有人提前多长时间取消预订。

当前,主要有两个数据数组:

1)TimeMeta:这是预留时隙的数组。

$time_meta = array([
    [
        'id' => '9',
        'start_date' => '2019-06-19',
        'end_date' => '2019-06-19',
        'start_time' => '08:00:00',
        'end_time' => '09:00:00'
    ],
    [
        'id' => '10',
        'start_date' => '2019-06-20',
        'end_date' => '2019-06-20',
        'start_time' => '08:00:00',
        'end_time' => '09:00:00'
    ],
    [
        'id' => '11',
        'start_date' => '2019-06-21',
        'end_date' => '2019-06-20',
        'start_time' => '08:00:00',
        'end_time' => '09:00:00'
    ],
    [
        'id' => '12',
        'start_date' => '2019-06-22',
        'end_date' => '2019-06-20',
        'start_time' => '08:00:00',
        'end_time' => '09:00:00'
    ],
    [
        'id' => '13',
        'start_date' => '2019-06-23',
        'end_date' => '2019-06-23',
        'start_time' => '08:00:00',
        'end_time' => '09:00:00'
    ]
])

2)根据小时数退款价值

$refunds = array([
    [
        'before_hours' => '12',
        'refund_percent' => '50'
    ],
    [
        'before_hours' => '24',
        'refund_percent' => '70'
    ],
    [
        'before_hours' => '48',
        'refund_percent' => '90'
    ]
])

到目前为止,我可以如下计算当前日期时间和保留日期时间之间的差值

foreach($time_meta as $ik => $iv){
                $start_datetime = $iv->start_date->format('Y-m-d').' '.$iv->start_time;
                $start_datetime = \Carbon\Carbon::parse($start_datetime);
                $diff = $now->diffInHours($start_datetime,false);

// NEED CODE HERE TO DETERMINE THE EXACT REFUND PERCENT
// ACCORDING TO TIME DIFFERENCE BETWEEN NOW AND THE BOOKED DATE

}

现在,我想找到最匹配的退款百分比。因此,例如,如果用户尝试在23小时之前取消预订事件,则退款百分比应仅为50%,因为12小时仅比refund数组中的23小时小。

测试用例

  11 hrs before = (should not be refund) as lowest value is 12 hours before
  23 hrs before = (should be refund as) 12 hours before
  24 hrs before = (should be refund as) 24 hours before
  46 hrs before = (should be refund as) 24 hours before
  48 hrs before = (should be refund as) 48 hours before

此外,如果活动日期已经过去,那么在这种情况下,$diff的值为负,这意味着通过日期不会退款。

1 个答案:

答案 0 :(得分:0)

在TimeMeta数组中,它包含子数组,并且子数组包含多个保留时间数组,这需要嵌套的foreach循环。 所以TimeMeta数组可能是以下

$time_meta = [
            [
                'id' => '9',
                'start_date' => '2019-06-19',
                'end_date' => '2019-06-19',
                'start_time' => '08:00:00',
                'end_time' => '09:00:00'
            ],
            [
                'id' => '10',
                'start_date' => '2019-06-20',
                'end_date' => '2019-06-20',
                'start_time' => '08:00:00',
                'end_time' => '09:00:00'
            ],
            [
                'id' => '11',
                'start_date' => '2019-06-21',
                'end_date' => '2019-06-20',
                'start_time' => '08:00:00',
                'end_time' => '09:00:00'
            ],
            [
                'id' => '12',
                'start_date' => '2019-06-22',
                'end_date' => '2019-06-20',
                'start_time' => '08:00:00',
                'end_time' => '09:00:00'
            ],
            [
                'id' => '13',
                'start_date' => '2019-06-23',
                'end_date' => '2019-06-23',
                'start_time' => '08:00:00',
                'end_time' => '09:00:00'
            ]
        ];

和退款数组可能如下。

$refunds = [
            [
                'before_hours' => '12',
                'refund_percent' => '50'
            ],
            [
                'before_hours' => '24',
                'refund_percent' => '70'
            ],
            [
                'before_hours' => '48',
                'refund_percent' => '90'
            ]
        ];

在TimeMeta数组中,start_date和start_time格式是正确的日期和时间格式,因此无需转换格式'Y-m-d'。

尝试以下代码,

foreach($time_meta as $data)
        {

            $start_datetime = $data['start_date']." ".$data['start_time'];
            $start_datetime = \Carbon\Carbon::parse($start_datetime);
            $diff = \Carbon::now()->diffInHours($start_datetime, false);

            // NEED CODE HERE TO DETERMINE THE EXACT REFUND PERCENT
            // ACCORDING TO TIME DIFFERENCE BETWEEN NOW AND THE BOOKED DATE

            $refund_per = 0;

            if($diff > 0)
            {
                foreach($refunds as $re)
                {
                    $hr = $re['before_hours'];


                    if($diff < intval($hr))
                    {
                        break;
                    }
                    else if($diff == intval($hr))
                    {
                        $refund_per = $re['refund_percent'];
                        break;
                    }

                    $refund_per = $re['refund_percent'];
                }

            }

            if($refund_per != 0)
            {
                echo "STARTING DATE :".$start_datetime."  REFUND PERCENTAGE :".$refund_per ."<BR>";
            }
            else
            {
                echo "STARTING DATE :".$start_datetime."  NO REFUND <BR>";
            }

        }

如果在退款数组中按升序排列'before_hours'值,此示例代码将正常工作。