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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (54)

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

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

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变量中再次更新它

要么

foreach($questions as &$question){

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

根据PHP foreach文档

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

用户回答回答于

当然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和明确的。

扫码关注云+社区