I’d always read to unset the variables passed by reference in PHP’s foreach loop. Here’s an example:
foreach ($posts as &$post) {
$current_post = self::get_current_version_for_post($post->ID, true, true);
$post->current_post_modified = mysql2date('U', $current_post->post_modified);
}
unset($post);
In the above code I was looping through a set of parent posts and using a custom method to get what I was calling the ‘current version’ which was really just the most recent child post. Then I added post modified date to the object.
Originally, I had forgotten to add the unset($post)
line.
Later on however I was sorting the newly altered $posts
objects by the current_post_modified
value with this line and method:
usort($posts, array('Essays_For_Comment', 'sort_by_date'));
public function sort_by_date($a, $b) {
$a = $a->current_post_modified;
$b = $b->current_post_modified;
if ($a == $b) {
return 0;
}
return ($a < $b) ? 1 : -1;
}
Each $a
and $b
was a post object passed with all it’s values. For some reason the last value of $a->current_post_modified;
passed would equal the first objects value only, no other elements at all. It was because I had forgotten to unset the $post
variable. That left a reference attached to the last element that was altered in the foreach()
loop. (? is that what happened?).
This bug was not happening on my local install where I was running 5.4 but it was happening on the server running 5.3. ?