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



我正在改变多维数组的值,并且它没有停留在用于遍历它的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;
}

相关内容

  • 没有找到相关文章

最新更新