当前位置:

首页 > 编程开发 > 如何检查值是否不在数组中并生成对应的非工作日列表

如何检查值是否不在数组中并生成对应的非工作日列表

如何检查值是否不在数组中并生成对应的非工作日列表 本文介绍在 PHP 中高效判断当前日期是否未出现在分组工作日数组中,并据此构建非工作日列表的完整实现方法,涵盖 array_column 与 in_array 的正确组合用法、避免重复逻辑、日期格式对齐及结构化输出。 在考勤或排班系统的开发中,我们常

如何检查值是否不在数组中并生成对应的非工作日列表

本文介绍在 PHP 中高效判断当前日期是否未出现在分组工作日数组中,并据此构建非工作日列表的完整实现方法,涵盖 array_column 与 in_array 的正确组合用法、避免重复逻辑、日期格式对齐及结构化输出。

如何检查值是否不在数组中并生成对应的非工作日列表

在考勤或排班系统的开发中,我们常常会遇到一个经典场景:需要根据预设的「工作日规则」,动态判断今天是不是某个组的「非工作日」。具体来说,给定一个包含 `group_id` 和 `day`(其中1代表周日,2代表周一,以此类推至7代表周六)的对象数组 `$work_day_arr`,目标是要找出所有没有将今天设置为工作日的分组,并生成一个结构清晰的 `$day_off` 列表,其格式类似于 `['attendance_group_id' => 'xxx', 'off_date' => 'Y-m-d']`。

听起来很直接,对吧?但实际操作时,一些常见的实现陷阱会让结果偏离预期。先来看看原代码中暴露的三个关键问题:

  1. 逻辑错误:代码中间出现了 `if($work_day->day != $day_now + 1)`,这里的 `$work_day` 变量并未定义(本意应是 `$work_hour`)。更麻烦的是,PHP 的 `date('N')` 返回的是 1(周一)到 7(周日),而业务数据里 `day=1` 表示的是周日,两者语义完全对不上。
  2. 重复写入:原逻辑针对每一条不匹配的工作日记录,都会向结果数组追加一条记录。这直接导致同一个 `group_id` 在结果中重复出现多次,数据冗余严重。
  3. 检测粒度错误:问题的核心在于,判断依据应该是「每个 `group_id` 维度下,其工作日集合是否完全不含今天」,而不是逐条记录进行比对。这个根本性的差异决定了整个算法的设计方向。

那么,正确的解决思路是什么?其实可以归纳为一个清晰的步骤:先按 `group_id` 分组,再提取各组的工作日数字集合,最后检查当前的星期几是否不在该集合中。这里,`array_column()` 配合 `in_array()` 将成为我们的核心工具。

// 1. 获取今日星期几(PHP date('N'):1=周一, 7=周日)
$todayWeekday = (int) date('N');
// 注意:数据中 day=1 表示周日 → 需统一映射!

// 2. 修正日期映射:将 date('N') 转为「1=周日」标准(即:周日→1,周一→2...周六→7)
$normalizedToday = $todayWeekday === 1 ? 7 : $todayWeekday - 1; // 1→7, 2→1, 3→2...7→6

// 3. 按 group_id 分组工作日数据
$groupedWorkDays = [];
foreach ($work_day_arr as $item) {
    $groupId = $item->group_id;
    if (!isset($groupedWorkDays[$groupId])) {
        $groupedWorkDays[$groupId] = [];
    }
    $groupedWorkDays[$groupId][] = (int) $item->day;
}

// 4. 遍历每个分组,检查 normalizedToday 是否不在其工作日列表中
$day_off = [];
$date_now = date('Y-m-d'); // 确保日期格式统一
foreach ($groupedWorkDays as $groupId => $workDays) {
    // 使用 in_array 检查当前标准化星期几是否缺失
    if (!in_array($normalizedToday, $workDays, true)) {
        $day_off[] = (object) [
            'attendance_group_id' => $groupId,
            'off_date' => $date_now
        ];
    }
}

实现代码如上,但有几个关键注意事项必须牢记,它们直接关系到程序的正确性与健壮性:

  • 日期映射必须统一:这是最容易出错的一环。`date('N')` 以周一为1,而业务数据以周日为1。因此,必须进行转换(`$normalizedToday = $todayWeekday === 1 ? 7 : $todayWeekday - 1`),确保比较是在同一套标准下进行。
  • 避免重复:有人可能会想直接用 `array_column($work_day_arr, 'day', 'group_id')` 来分组,但这个方法会覆盖同一 `group_id` 的多条记录,无法满足我们收集所有工作日需求。手动分组是更稳妥的选择。
  • 严格类型比较:在使用 `in_array()` 时,务必启用严格模式(第三个参数设为 `true`),即 `in_array($val, $arr, true)`。这可以防止因 `1 == '1'` 这类隐式类型转换而导致的误判。
  • 性能提示:如果初始数据量非常大,可以考虑在分组后对每个 `$workDays` 数组使用 `array_unique()` 去重,再用 `array_values()` 重置索引。这在某些极端场景下能带来一定的性能优化。

遵循以上方法和注意事项,最终生成的 `$day_off` 列表将为每一个「未安排今日工作」的分组,产出唯一一条记录。整个输出结构清晰,毫无冗余,完全满足生产环境对代码健壮性和数据准确性的要求。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
下一篇: 测试测试3333ww222
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

好衣库售后怎么样?把保障体系拆开看
好衣库售后怎么样?把保障体系拆开看

好衣库售后全程由平台统一受理,绝不甩给店主,店主零售后负担。物流合作顺丰、京东、菜鸟三大优质快递,退货运费险由人保、众安保承保。消费者全面享直购标准,退换货由平台全额兜底,买卖双方均安心省心无忧。

全电作业新标杆!2026款长安猎手K50上市,14.19万起重塑皮卡体验
全电作业新标杆!2026款长安猎手K50上市,14.19万起重塑皮卡体验

2026款长安猎手K50增程皮卡上市,售价14.19万至17.89万元。搭载2.0T超级大增程系统,双电机峰值功率240kW,百公里加速5.9秒。配备宁德时代2C电池,纯电续航192公里,总电力储备239kWh,支持30kW+3.3kW双功率供电,实现全场景用电覆盖。

2026年车市新势力崛起:新车型成销量担当,零跑A10单月破2万领跑
2026年车市新势力崛起:新车型成销量担当,零跑A10单月破2万领跑

2026年5月,国内乘用车出口78.4万辆,同比增长75.1%,占厂商总销量35%。新车型成为增长核心引擎,零跑A10以2.2万辆登顶新车型冠军。消费者需求加速从功能满足转向体验升级,汽车产业进入高速迭代周期,推动行业洗牌。

十七载深耕智能领域,长安“天枢领航”亮相车展引领安全出行新体验
十七载深耕智能领域,长安“天枢领航”亮相车展引领安全出行新体验

长安汽车在重庆车展发布“天枢领航”辅助驾驶系统,从安全防护、减轻压力到智能交互三个维度升级出行体验。该系统基于十七年技术深耕,依托天枢智能实验中心积累超40万虚拟场景,实测500万公里覆盖185类典型场景,形成技术-场景-用户闭环优化机制。

《2025年度北京历史文化名城保护大事记》发布
《2025年度北京历史文化名城保护大事记》发布

2025年度北京历史文化名城保护大事记发布,收录94项代表性事件。关键进展包括《北京中轴线世界文化遗产保护条例》施行、先农坛校址腾退实现空间贯通、长辛店老镇启动区开街、路县故城遗址公园试运行等,标志保护工作从被动抢救转向主动规划。

DBeaver 25.3.3 发布
DBeaver 25.3.3 发布

DBeaver25.3.3发布,优化SQL编辑器响应速度与资源占用,AI辅助自动禁用不兼容模型的temperature参数。数据编辑器默认对SELECT查询自动统计行数,修复数据迁移对话框尺寸异常。重构自动提交逻辑,升级UI布局,修正事务状态显示及macOS欢迎画面。数据库适配增强:ClickHouse修复空格解析,Sybase修复双击表打开,DuckDB新

REDMI 17与Note 17系列通过认证 Note 17系列或7、8月发布
REDMI 17与Note 17系列通过认证 Note 17系列或7、8月发布

红米十七与Note十七系列已经通过多项国际认证。红米十七搭载骁龙六sGen二四G版,含日本专属版本和POCO联名版C九五Pro。Note十七系列由三款机型组成,均基于骁龙平台,预计二零二六年七至八月率先在中国上市。

美股科技板块剧烈震荡:心片股集体承压 ARM跌超6%
美股科技板块剧烈震荡:心片股集体承压 ARM跌超6%

当地时间6月9日,美股三大指数走势分化,纳指与标普500双双收跌。科技板块调整明显,半导体ETF盘中最大跌幅超7%,费城半导体指数一度大跌逾8.6%。ARM跌超6%,Coherent跌逾11%,部分AI相关个股也显著回调。

macOS Golden Gate调整菜单设计 移除菜单项图标
macOS Golden Gate调整菜单设计 移除菜单项图标

macOSGoldenGate更新后移除了菜单项图标,回归简洁纯文字布局。此前Tahoe版本引入图标但辨识度低,反而拖慢浏览效率。此次调整遵循简洁原则,显著提升可读性与操作效率,是对用户反馈的理性精简。这一改动减少视觉干扰,菜单栏更清晰,用户可快速定位功能。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。