PHP – 在foreach循环中修改当前对象

我想知道是否有可能编辑在foreach循环内处理的当前对象

我正在处理一个对象数组$questions ,我想要通过在数据库中查找与该问题对象相关的答案。 所以对于每个问题去获取答案对象,并更新我的foreach循环的当前$question所以我可以输出/处理其他地方。

 foreach($questions as $question){ $question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']); } 

有两种方法可以做到这一点

  foreach($questions as $key => $question){ $questions[$key]['answers'] = $answers_model->get_answers_by_question_id($question['question_id']); } 

这样你保存密钥,所以你可以在$questions主variables中重新更新它

要么

 foreach($questions as &$question){ 

添加&将保持$questions更新。 但是我会说第一个是推荐的,即使这个更短(见Paystey的评论)

根据PHP的foreach文档 :

为了能够直接修改循环中的数组元素,使用&前面的$ value。 在这种情况下,值将通过引用来分配。

当然使用array_map ,如果使用一个容器实现ArrayAccess来派生对象只是一个更聪明的,语义的方式来做到这一点?

在我看过的大多数语言和实现中,数组映射的语义是相似的。 它的目的是返回一个基于input数组元素的修改数组(高级忽略语言编译/运行时types首选项); 循环意味着执行更多的逻辑。

对于通过ID / PK检索对象,取决于你是否使用SQL(似乎build议),我会使用一个filter,以确保我得到一个有效的PK数组,然后implode用逗号放置到一个SQL IN()子句返回结果集。 它通过SQL调用一次而不是几次,优化一些call->wait周期。 最重要的是,我的代码能够很好的读懂任何有语言能力的语言的人,而且我们不会遇到可变性问题。

 <?php $arr = [0,1,2,3,4]; $arr2 = array_map(function($value) { return is_int($value) ? $value*2 : $value; }, $arr); var_dump($arr); var_dump($arr2); 

VS

 <?php $arr = [0,1,2,3,4]; foreach($arr as $i => $item) { $arr[$i] = is_int($item) ? $item * 2 : $item; } var_dump($arr); 

如果你知道你在做什么永远不会有可变性问题(铭记如果你打算重写$arr你总是可以$arr = array_map并且是明确的。