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 循环后保留的主要内容,如果未能解决你的问题,请参考以下文章