Php 修改foreach循环中的数组值

Php 修改foreach循环中的数组值,php,arrays,object,foreach,Php,Arrays,Object,Foreach,我想知道是否可以编辑在foreach循环中处理的当前对象 我正在处理一组对象$questions,我想在数据库中查找与该问题对象相关的答案。因此,对于每个问题,获取答案对象并更新当前的$question内部myforeach循环,以便我可以在其他地方输出/处理 foreach($questions as $question){ $question['answers'] = $answers_model->get_answers_by_question_id($question['q

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

我正在处理一组对象
$questions
,我想在数据库中查找与该问题对象相关的答案。因此,对于每个问题,获取答案对象并更新当前的
$question
内部my
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
变量中再次更新密钥

添加
&
将保持
$questions
的更新。但我想说的是,第一个是推荐的,尽管它比较短(见Paystey的评论)

Per:

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


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

foreach($questions as $key => $question){
    $questions[$key]['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
这样可以保存密钥,以便在主
$questions
变量中再次更新密钥

添加
&
将保持
$questions
的更新。但我想说的是,第一个是推荐的,尽管它比较短(见Paystey的评论)

Per:

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


当然,使用
array\u 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);

使用
array\u-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);

不建议使用
foreach
中的
引用,因为
foreach
传递循环值部分的方式会导致不可预测的行为。可能会更长,但在这里使用方法1要安全得多。我刚刚花了一个小时来调试在foreach中使用引用引起的问题。我在第二个foreach调用中重复使用了相同的变量名——因为我通过引用传递了第一个变量名,所以它一直在修改数组中的最后一项!使用显式索引不会有这个问题。@Paystey你能引用你的来源或给出详细的解释吗?为什么操纵引用是不安全的?必须在任何地方操作引用的C/C++是否不安全?安全与否取决于你,而不是语言。@BabyAzerty:Paystey没有说“一般”引用,但在
foreach
中,关于这样的恐怖:(@Nico,仅供参考。)
foreach
中的引用确实不推荐,
foreach
传递循环值部分的方式会导致不可预测的行为。可能会更长,但在这里使用方法1要安全得多。我刚刚花了一个小时来调试在foreach中使用引用引起的问题。我在第二个foreach调用中重复使用了相同的变量名——因为我通过引用传递了第一个变量名,所以它一直在修改数组中的最后一项!使用显式索引不会有这个问题。@Paystey你能引用你的来源或给出详细的解释吗?为什么操纵引用是不安全的?必须在任何地方操作引用的C/C++是否不安全?安全与否取决于你,而不是语言。@BabyAzerty:Paystey没有说“一般”参考,而是在
foreach
中,关于这样的恐怖:(@Nico,仅供参考。)正如ArtjomKurapov和@topener所说,我正在使用&符号寻找“通过参考”。谢谢,伙计们:)祝你们过得愉快,因为ArtjomKurapov和@topener都建议我使用&符号寻找“参考传递”。感谢各位:)祝你们度过愉快的一天比使用foreach更直观-这正是此函数的设计目的。比使用foreach更直观-这正是此函数的设计目的。