PHP - 修改foreach循环中的当前对象

时间:2012-04-12 10:06:57

标签: php arrays object foreach

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

我正在使用一组对象$questions,我希望在我的数据库中查找与该问题对象相关的答案。因此,对于每个问题,请获取答案对象并更新当前$question 内部我的foreach循环,以便我可以在其他地方输出/处理。

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

2 个答案:

答案 0 :(得分:178)

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

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

这样您就可以保存密钥,因此您可以在主$questions变量

中再次更新密钥

foreach($questions as &$question){

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

the PHP foreach documentation

  

为了能够直接修改循环中的数组元素,在$ value之前加上&amp ;.在这种情况下,该值将通过引用分配。

答案 1 :(得分:5)

当然使用array_map并且如果使用实现ArrayAccess的容器来派生对象,那么这只是一种更聪明的语义方式吗?

我已经看到的大多数语言和实现的数组映射语义都是类似的。它被设计为基于输入数组元素返回修改后的数组(高级忽略语言编译/运行时类型首选项);循环意味着执行更多逻辑。

对于通过ID / PK检索对象,取决于您是否使用SQL(似乎建议),我使用过滤器来确保获得有效PK的数组,然后进行内爆使用逗号并放入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并明确。