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
并且是明确的。