您的位置:首页 >如何检查值是否不在数组中并生成对应的非工作日列表
发布于2026-05-03 阅读(0)
扫一扫,手机访问
本文介绍在 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']`。
听起来很直接,对吧?但实际操作时,一些常见的实现陷阱会让结果偏离预期。先来看看原代码中暴露的三个关键问题:
那么,正确的解决思路是什么?其实可以归纳为一个清晰的步骤:先按 `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
];
}
}
实现代码如上,但有几个关键注意事项必须牢记,它们直接关系到程序的正确性与健壮性:
遵循以上方法和注意事项,最终生成的 `$day_off` 列表将为每一个「未安排今日工作」的分组,产出唯一一条记录。整个输出结构清晰,毫无冗余,完全满足生产环境对代码健壮性和数据准确性的要求。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9