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

发布时间 - 2026-01-21 00: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
        )
)

⚠️ 关键注意事项:

  • 勿复用累加变量:原始代码中 $price 在外层循环外定义,导致房间间价格相互污染。务必为每个房间重置 $total = 0。
  • 避免日期格式转换开销:示例中直接使用字符串比对(===),前提是输入日期格式严格统一(如 'd-m-Y')。若需兼容多种格式(如 'Y-m-d'),再引入 Carbon::parse() 并标准化格式。
  • array_filter + current() 更安全:相比手动遍历或 array_key_first(),current() 可安全获取首个匹配项(即使键非数字),且语义清晰。
  • 性能提示:若 options 数量极大(>1000 条),建议预先构建 date → price 的哈希映射(如 array_column($room['options'], 'price', 'date')),将单次查找从 O(n) 优化至 O(1)。

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


# php  # laravel  # symfony  # carbon  # date  # 字符串  # 循环  # 是一个  # 多个  # 遍历  # 适用于  # 首个  # 房型  # 酒店预订  # 何为  # 比对  # 为该 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Linux系统命令中tree命令详解  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何正确选择百度移动适配建站域名?  Android Socket接口实现即时通讯实例代码  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  ,网页ppt怎么弄成自己的ppt?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  JavaScript常见的五种数组去重的方式  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  使用spring连接及操作mongodb3.0实例  Laravel怎么为数据库表字段添加索引以优化查询  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  ,在苏州找工作,上哪个网站比较好?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  微信小程序 闭包写法详细介绍  重庆市网站制作公司,重庆招聘网站哪个好?  如何快速选择适合个人网站的云服务器配置?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何用免费手机建站系统零基础打造专业网站?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何为不同团队 ID 动态生成多个独立按钮  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Python函数文档自动校验_规范解析【教程】  如何快速搭建高效香港服务器网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel中的withCount方法怎么高效统计关联模型数量  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  微信小程序 scroll-view组件实现列表页实例代码  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何挑选优质建站一级代理提升网站排名?  JavaScript如何实现音频处理_Web Audio API如何工作?  Android利用动画实现背景逐渐变暗  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在IIS中新建站点并配置端口与IP地址?  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程