在 foreach 循环中修改数组值

Posted

技术标签:

【中文标题】在 foreach 循环中修改数组值【英文标题】:Modify array values in foreach loop 【发布时间】:2012-04-24 16:12:51 【问题描述】:

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

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

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

【问题讨论】:

正如 ArtjomKurapov 和 @topener 建议的那样,我正在使用 & 符号寻找“通过引用传递”。谢谢小伙子:)祝你有美好的一天 【参考方案1】:

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

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 前加上&。在这种情况下,值将通过引用分配。

【讨论】:

确实不推荐在foreach 中引用,foreach 绕过循环的值部分的方式会导致不可预测的行为。可能会更长,但在这里使用方法 1 会更安全。 我刚刚花了一个令人困惑的小时来调试一个由在 foreach 中使用引用引起的问题。我在第二次 foreach 调用中重新使用了相同的变量名——因为我通过引用传递了第一个,它不断修改数组中的最后一项!使用显式索引不会有这个问题。 @Paystey 你能引用你的资料或给出详细解释吗? 为什么操作引用是不安全的? C/C++ 是否必须在任何地方操作引用不安全?是否安全取决于您,而不是语言。 @BabyAzerty:Paystey 没有提到“一般”,而是在foreach 中提到了这样的恐怖:***.com/questions/3307409/…(@Nico,仅供参考。)【参考方案2】:

肯定使用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 并保持明确。

【讨论】:

比执行 foreach 更直观 - 这正是该函数的设计目的。 除非您无权访问密钥。

以上是关于在 foreach 循环中修改数组值的主要内容,如果未能解决你的问题,请参考以下文章

为啥在foreach循环中不能修改值类型实例

php中foreach使用引用的陷阱

foreach用法

foreach用法

foreach与for的区别

php foreach循环中的变量