贝利信息

计算房间在指定日期范围内的总价:按日期匹配选项价或回退默认价

日期:2026-01-21 00:00 / 作者:霞舞

本文详解如何为多个房间分别计算一组选定日期的总价格——对每个日期,优先使用 `options` 中匹配的特定价格,未匹配则 fallback 到 `default_price`,并汇总得出各房间的 `total_price`。

在酒店预订、会议室租赁等场景中,常需根据用户选择的连续日期(如入住/退房区间),动态计算不同房型的总费用。关键逻辑在于:每个日期单独判断价格来源——若该日期在房间的 options 数组中存在明确配置,则采用对应 price;否则统一使用 default_price。最终将所有选中日期的价格相加,即为该房间的 total_price。

以下是一个简洁、可读性强且无副作用的实现方案(兼容 PHP 7.4+):

$selectedDates = ['10-04-2025', '11-04-2025', '12-04-2025'];

$setRooms = [
    [
        'id'            => 1,
        'title'         => 'Room1',
        'default_price' => 50,
        'options'       => [
            ['date' => '12-04-2025', 'price' => 100],
            ['date' => '13-04-2025', 'price' => 200]

, ['date' => '14-04-2025', 'price' => 200], ] ], [ 'id' => 2, 'title' => 'Room2', 'default_price' => 120, 'options' => [ ['date' => '11-04-2025', 'price' => 200], ['date' => '12-04-2025', 'price' => 300], ['date' => '13-04-2025', 'price' => 400], ] ], ]; $result = []; foreach ($setRooms as $room) { $total = 0; foreach ($selectedDates as $date) { // 精确匹配 date 字段(字符串相等,避免 Carbon 解析开销) $matchedOptions = array_filter($room['options'], fn($opt) => $opt['date'] === $date); if (count($matchedOptions) === 1) { $total += current($matchedOptions)['price']; } else { $total += $room['default_price']; } } $result[] = [ 'id' => $room['id'], 'title' => $room['title'], 'total_price' => $total ]; } print_r($result);

输出结果:

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Room1
            [total_price] => 200   // 50 + 50 + 100
        )
    [1] => Array
        (
            [id] => 2
            [title] => Room2
            [total_price] => 620   // 120 + 200 + 300
        )
)

⚠️ 关键注意事项:

该方案结构清晰、无外部依赖、易于单元测试,适用于 Laravel、Symfony 或纯 PHP 项目。