
本文介绍两种在 php 中去除多维数组内重复任务值的实用方法:使用 array_unique() 函数去重,或在插入前通过 in_array() 判断避免重复添加,适用于从数据库批量查询后需去重的场景。
本文介绍两种在 php 中去除多维数组内重复任务值的实用方法:使用 array_unique() 函数去重,或在插入前通过 in_array() 判断避免重复添加,适用于从数据库批量查询后需去重的场景。
在实际开发中,我们常需根据用户角色(如 $_SESSION['ROLES'])动态查询对应任务列表,并聚合到以员工 ID 为键的关联数组中。但当多个角色返回相同任务时(如任务 "21"、"22" 多次出现),最终结果会出现冗余,影响后续逻辑与展示。以下提供两种专业、可维护的解决方案:
✅ 方案一:使用 array_unique() 统一去重(推荐)
该方式逻辑清晰、性能稳定,尤其适合结果集较大时。关键在于先收集所有任务到临时数组,再统一去重并赋值:
function Job($conn) {
$array = [];
// 确保角色 ID 本身无重复(防 SQL 重复执行)
$uniqueRoles = array_unique($_SESSION['ROLES']);
foreach ($uniqueRoles as $roleId) {
$sql = "SELECT employee, task FROM table WHERE id = ? AND employee = 24";
// ⚠️ 强烈建议使用预处理语句防止 SQL 注入(示例中用 ? 占位符示意)
$result = $conn->executeSQL($sql, [$roleId]); // 假设 executeSQL 支持参数绑定
$tasks = [];
foreach ($result as $row) {
$tasks[] = $row['task']; // 提取所有 task 值
}
// 对当前员工的所有任务去重,并强制重置索引(可选)
$array[24] = array_values(array_unique($tasks));
}
return $array;
}
? 注意:原始代码中 $value['employee'] 在外层循环后已不可用(变量被覆盖),应明确使用固定键(如 24)或从 $result 中安全提取;同时务必改用参数化查询替代字符串拼接,杜绝 SQL 注入风险。
✅ 方案二:插入前校验(适合小数据量或需实时控制)
若任务数量较少,或需在构建过程中即时跳过重复项,可采用条件判断方式:
function Job($conn) {
$array = [];
foreach (array_unique($_SESSION['ROLES']) as $roleId) {
$sql = "SELECT employee, task FROM table WHERE id = ? AND employee = 24";
$result = $conn->executeSQL($sql, [$roleId]);
foreach ($result as $row) {
$empId = $row['employee'];
$task = $row['task'];
// 仅当该任务尚未存在于当前员工数组中时才添加
if (!in_array($task, $array[$empId] ?? [])) {
$array[$empId][] = $task;
}
}
}
return $array;
}
⚠️ 性能提示:in_array() 在大数据集上时间复杂度为 O(n),若单员工任务超百条,建议优先选用方案一;此外,$array[$empId] ?? [] 提供了空数组默认值,避免未定义索引警告。
✅ 最终效果对比
输入(含重复):
[24] => ['21', '22', '21', '22']
输出(去重后):
[24] => ['21', '22'] // 索引自动重排为 0,1
? 总结建议
- 首选方案一:语义明确、性能可控、易于测试;
- 始终使用预处理语句:严禁直接拼接用户数据(如 $_SESSION['ROLES'])到 SQL 中;
- 注意变量作用域:避免内层 foreach($result as $value) 覆盖外层循环变量;
- 如需保持原始顺序且去重,array_unique() 完全满足;若需按数据库顺序保留首次出现项,它也天然支持(PHP 8.0+ 保持键名,可用 array_values() 重置索引)。
通过以上任一方式,即可稳健、安全地返回无重复任务的结构化数组。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











