修改 foreach 循环中的数组值

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

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

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

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

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)

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);

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