
本文介绍两种高效去除 PHP 关联数组内重复任务值的方法:一是使用 array_unique() 对子数组去重,二是插入前通过 in_array() 判断避免重复添加,均适用于从数据库批量查询后按员工分组去重的场景。
本文介绍两种高效去除 php 关联数组内重复任务值的方法:一是使用 `array_unique()` 对子数组去重,二是插入前通过 `in_array()` 判断避免重复添加,均适用于从数据库批量查询后按员工分组去重的场景。
在实际开发中,我们常需根据用户角色(如 $_SESSION['ROLES'])批量查询数据库,并将结果按员工 ID 分组聚合任务列表。但当多个角色对应相同员工与任务时,容易产生重复数据,例如:
[24] => Array
(
[0] => "21"
[1] => "22"
[2] => "21" // 重复
[3] => "22" // 重复
)
为确保每个员工对应的任务列表无冗余,推荐以下两种专业、安全且可读性强的解决方案:
✅ 方案一:批量去重(推荐)
先收集全部任务到临时数组,再统一调用 array_unique() 去重并重置键名(可选):
function Job($conn) {
$array = [];
foreach (array_unique($_SESSION['ROLES']) as $role_id) {
$sql = "SELECT employee, task FROM table WHERE id = ? AND employee = 24";
// ⚠️ 强烈建议使用预处理语句防止 SQL 注入(此处为兼容原逻辑暂用拼接,生产环境务必改写)
$result = $conn->executeSQL($sql, [$role_id]); // 假设 executeSQL 支持参数绑定
$tasks = [];
foreach ($result as $row) {
$tasks[] = $row['task'];
}
// 去重并重新索引(保证键为 0,1,2...)
$array[$row['employee']] = array_values(array_unique($tasks));
}
return $array;
}
? 优势:逻辑清晰、性能稳定(尤其当单次查询返回较多记录时),且 array_unique() 内部优化良好。
✅ 方案二:增量去重(适合小数据量或需实时控制)
在每次向目标数组追加前,显式检查是否已存在该任务值:
function Job($conn) {
$array = [];
foreach (array_unique($_SESSION['ROLES']) as $role_id) {
$sql = "SELECT employee, task FROM table WHERE id = ? AND employee = 24";
$result = $conn->executeSQL($sql, [$role_id]);
foreach ($result as $row) {
$empId = $row['employee'];
$task = $row['task'];
// 初始化员工子数组(若不存在)
if (!isset($array[$empId])) {
$array[$empId] = [];
}
// 仅当任务未出现过时才添加
if (!in_array($task, $array[$empId], true)) {
$array[$empId][] = $task;
}
}
}
return $array;
}
⚠️ 注意:in_array() 在大数据量下时间复杂度为 O(n),若单员工任务数超百条,性能会明显下降;建议配合 array_flip() 转为键值映射进一步优化(见进阶提示)。
? 安全与最佳实践提醒
- SQL 注入风险:原始代码中直接拼接 $value 到 SQL 字符串极不安全。务必改用预处理语句(如 PDO 的 prepare/execute 或 MySQLi 的 bind_param)。
- 类型严格比较:in_array($task, $array[$empId], true) 中的第三个参数 true 启用严格类型检查,避免 "1" 与 1 被误判为相同。
- 空结果处理:$result 可能为空数组,$row['employee'] 在空循环中可能未定义——方案一中已通过 $row 最终值取键,方案二中建议在 foreach 外初始化 $empId 或增加非空校验。
综上,方案一更简洁、健壮,是首选方案;若业务逻辑需在插入时附加日志、触发钩子等操作,则可选用方案二并做好性能评估。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











