计算房间在指定日期范围内的总价:按日期匹配选项价或回退默认价
发布时间 - 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文档导出工具与使用教程


