我正在改变多维数组的值,并且它没有停留在用于遍历它的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设置了值。但是,如果I print_r($people)
在循环之外,则不设置$person['visited']
。我不知道我做错了什么。
感谢帮助
您正在创建一个名为$person
的新变量,从该for循环中,您的数组将永远不会看到该新变量的作用域。
你可以尝试通过引用传递它,像这样:
foreach ($people as &$person){
echo $person['name'];
....
logic for the visited variable
...
$person['visited'] = $calculated_visit_value;
}
From foreach的文档:
除非引用了数组,否则foreach操作对象都是对象的副本指定的数组,而不是数组本身。每个人都有自己的一面对数组指针的影响。期间不要依赖数组指针或在foreach之后不重置它。
这意味着你的$person变量是数组中内容的副本,效果类似于这段代码(注意,这段代码只是为了理解,在很多层面上是错误的,实际上你会使用reset(), current()和next()函数来正确地循环你的数组,见这里):
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的最后一个元素的引用。如果你不知道什么是引用,请参考文档获取更多信息。
或者使用键访问原始数组:
foreach ($people as $person_index => $person) {
$people[$person_index] = $calculated_visit_value;
}
对于您的信息,您可以将两者结合使用
foreach ($people as $person_index => &$person { ...
$person
数组在每次迭代中生成,因此设置该值无论如何都会在下一次迭代中被覆盖。
但即便如此,该数组也只在循环期间存在。您应该在循环之前创建另一个数组,并在循环期间将您的值放入该数组。
正如它被告知的那样,"您正在从该for循环中创建一个名为$person的新变量,并且您的数组永远不会看到该新变量的作用域。"
我发现这个解决方案更健壮:
foreach ($people as $key => $person)
{
echo $person['name'];
//logic for the visited variable
$people[$key]['visited']=$calculated_visit_value;
}