PHP:替换数组值不会在 foreach 循环后保留

Posted

技术标签:

【中文标题】PHP:替换数组值不会在 foreach 循环后保留【英文标题】:PHP: replace array value doesn't stay after foreach loop 【发布时间】:2011-10-08 22:37:09 【问题描述】:

我正在更改多维数组中的值,并且它不会停留在用于遍历它的 foreach 循环之外。

我的数组最初看起来像这样:

Array

  [0] => Array
   
     [name] => Bob
     [age] => 33
     [state] => CA
     [visited] => 0
   
   ...

我的 php 通过以下方式进入它:

foreach ($people as $person)
 echo $person['name']
 ....
 logic for the visited variable
 ...
 $person['visited'] = $calculated_visit_value;

如果我

print_r($person)

在 foreach 循环的最后(但在内部)一切看起来都不错,visited 的值已设置。但是,如果我在循环之外 print_r($people),则不会设置 $person['visited']。我不知道我做错了什么。

感谢您的帮助。

【问题讨论】:

您正在编辑由 foreach (as $...) 制作的数组的副本 【参考方案1】:

您正在从该 for 循环中创建一个名为 $person 的新变量,您的数组将永远不会看到该新变量的范围。

您可以尝试通过引用传递它,如下所示:

foreach ($people as &$person)
 echo $person['name'];
 ....
 logic for the visited variable
 ...
 $person['visited'] = $calculated_visit_value;

【讨论】:

是的,就是这样!谢谢你。我需要等待 7 分钟才能将其标记为正确,但效果很好。 这很完美,应该被标记为正确答案。【参考方案2】:

来自foreach's documentation:

除非该数组被引用,否则 foreach 对数组的副本进行操作 指定的数组而不是数组本身。 foreach 有一些方面 对数组指针的影响。期间不要依赖数组指针 或在 foreach 之后而不重置它。

这意味着您的 $person 变量是数组中内容的副本,与此代码的效果类似(请注意,此代码仅用于理解,在许多层面上都是错误的,实际上您会使用重置()、current() 和 next() 函数在您的数组上正确循环,see here):

for ($i = 0; $i < count($people); $i++) 
  $person = $people[$i];
  // code inside your foreach ...

因此,如果您更改 $person 的内容,实际上并不会修改 $people 数组中的内容

要解决这个问题,您可以使用引用的 foreach:

foreach ($people as &$person)  // note the &
  $person = $calculated_visit_value; // $person is now a reference to the original value inside $people and thus this will work as intended

请注意,当 foreach 循环结束时,引用并没有被清除,所以在循环结束时,$person 仍然是对 $people 的最后一个元素的引用。 如果您不知道引用是什么,请参阅the documentation 了解更多信息。

或者使用key访问原数组:

foreach ($people as $person_index => $person) 
  $people[$person_index] = $calculated_visit_value;

供您参考,您可以将两者一起使用

foreach ($people as $person_index => &$person  ...

【讨论】:

【参考方案3】:

$person 数组是在每次迭代时生成的,因此无论如何设置该值都会在下一次遍历时被覆盖。

但即便如此,该数组仅在循环期间存在。您应该在循环之前创建另一个数组,并在循环期间将您的值放入该数组中。

【讨论】:

【参考方案4】:

如前所述,“您正在该 for 循环中创建一个名为 $person 的新变量,而您的数组将永远无法看到该新变量的范围。”

我发现这个解决方案更强大:

foreach ($people as $key => $person)

  echo $person['name']; 

  //logic for the visited variable

  $people[$key]['visited']=$calculated_visit_value;

【讨论】:

以上是关于PHP:替换数组值不会在 foreach 循环后保留的主要内容,如果未能解决你的问题,请参考以下文章

php foreach 循环不会遍历整个数组

关于PHP中foreach循环修改数组值失效的问题

php中foreach使用引用的陷阱

使用 PHP 中的 foreach 循环将数组值转换为单个数组

PHP数组循环?

PHP - Wordpress - 插件小部件更新功能 - 更新数组值 [Foreach 循环不起作用]