126

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

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

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

2 回答 2

241

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

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 的评论)

根据PHPforeach文档

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

于 2012-04-12T10:08:55.557 回答
9

当然array_map,如果使用容器实现ArrayAccess来派生对象只是一种更智能的语义方式来解决这个问题?

数组映射语义在我见过的大多数语言和实现中都是相似的。它旨在根据输入数组元素返回修改后的数组(高级忽略语言编译/运行时类型首选项);循环旨在执行更多逻辑。

对于通过 ID / PK 检索对象,取决于您是否使用 SQL(似乎建议),我会使用过滤器来确保我得到一组有效的 PK,然后用逗号内爆并放入 SQLIN()子句中返回结果集。它通过 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);

对比

<?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明确。

于 2017-01-25T11:03:47.727 回答