PHP foreach循环中关联数组条件赋值旧值遗留异常问题咨询
问题原因
核心问题是每次循环没有对$preparedPart做初始化重置。你代码中写的$preparedPart;在PHP中没有实际赋值效果,PHP变量为函数级作用域,循环迭代时该变量会保留上一轮的所有属性值:
- 当某轮循环
$isAnnex为true时,会给$preparedPart['title2']赋值 - 后续轮次
$isAnnex为false时,既没有重置$preparedPart,也没有覆盖title2属性,就会直接复用之前留下的title2值
你移除if判断后运行正常,正是因为每次循环都会强制给title2赋当前项的新值,覆盖了上一轮的旧值,刚好规避了变量未重置的问题。
修复方案
只需要在每次循环开始时,强制将$preparedPart初始化为空数组即可,修改后的代码如下:
foreach ($study->children() as $rawPart) { $isAnnex = $rawPart->template()->name() === 'annex'; // 每次循环初始化空数组,清除上一轮的残留数据 $preparedPart = []; $preparedPart['title'] = (string)$rawPart->title(); $preparedPart['type'] = (string)$rawPart->template()->name(); // …其他属性赋值逻辑 if ($isAnnex) { $preparedPart['title2'] = (string)$rawPart->title(); } // 原有将$preparedPart推入结果集合的逻辑 }
如果你的业务需求是非annex类型的项也需要返回title2字段,值为空或null,可补充else分支:
if ($isAnnex) { $preparedPart['title2'] = (string)$rawPart->title(); } else { // 按需赋值为空字符串或null $preparedPart['title2'] = ''; }
内容的提问来源于stack exchange,提问作者isUnknown
相关产品推荐
相关产品推荐

