Understanding the Strange Behavior of PHP's Referenced Foreach Loop
In PHP, the foreach loop iterates over elements in an array or object. However, when using a reference within the loop (e.g., foreach ($a as &$v) { ... }), unexpected behavior can occur.
The Problem
Consider the following PHP script:
$a = array('a', 'b', 'c', 'd'); foreach ($a as &$v) { } foreach ($a as $v) { } print_r($a);
Expected Output:
An array with elements 'a', 'b', 'c', and 'd'.
Actual Output:
Array ( [0] => a [1] => b [2] => c [3] => c )
Explanation
The unexpected behavior arises because references created within the foreach loop persist after the loop terminates. Specifically, the last element in the $a array may still be referenced by the variable $v.
When the second foreach loop runs, $v (a reference to the last element in $a) is reassigned the value of each element in the array. Since $v is a reference to the last element in $a, the corresponding array element is modified.
Resolution
To prevent this behavior, always unset the reference variable after the foreach loop completes:
$a = array('a', 'b', 'c', 'd'); foreach ($a as &$v) { } unset($v); foreach ($a as $v) { } print_r($a);
Output:
Array ( [0] => a [1] => b [2] => c [3] => d )
The above is the detailed content of Why Does PHP's Referenced Foreach Loop Exhibit Unexpected Behavior?. For more information, please follow other related articles on the PHP Chinese website!