
在 php 中,若在 foreach 循环内反复赋值给同一数组变量(如 `$allowed_values = [...]`),会导致每次迭代都覆盖前一次结果,最终仅保留最后一次循环的值;正确做法是预先初始化数组,再在循环中逐项追加键值对。
这是一个典型的数组累积构建误区。原始代码的问题在于:每次循环都重新声明并赋值整个 $allowed_values 数组,而非向其追加元素。因此,无论 $reviewers 包含多少个键值对,最终 $allowed_values 只会保留最后一次迭代的两个元素(空字符串 'All' 和最后一个 $login_name => $common_name)。
✅ 正确写法是——先初始化基础结构,再在循环中动态扩展:
$allowed_values = ['' => 'All']; // 预设默认选项
foreach ($reviewers as $login_name => $common_name) {
$allowed_values[$login_name] = $common_name; // 仅添加,不重置
}这样,$allowed_values 将完整包含 'All' 以及所有 $reviewers 中的映射关系,顺序与原数组一致(PHP 7.4+ 保持插入顺序)。
⚠️ 注意事项:
- 切勿在循环体内用 = 赋值整个数组,应使用 [] 语法或 array_merge() 等安全追加方式;
- 若需去重或排序,可在循环结束后统一处理(如 ksort($allowed_values));
- 对于超大数组,该方式性能高效,无额外内存拷贝开销。
掌握这一模式,可避免大量因误覆写导致的数据丢失问题,是 PHP 数组构建的基础实践之一。










