Чтобы воспроизвести баг я написал вот такой небольшой пример:
" microtime(1), $i); //fill array with some examples
}
foreach ($a as &$b) {
//do nothing, with link on value '&'
}
foreach ($a as $b) {
//do nothing, without '&'
}
print_r($a); //LOOK AT LAST 2
По умолчанию в переборе foreach для значения создается копия элемента из массива, но если нам надо внести правки в исходные значения - можно создать ссылку на элемент массива.
Суть проблемы - переменная AS из форича доступна в глобальном скоупе после конца цикла и содержит последний элемент перебора, в нашем случае ссылку на последний элемент массива. Используя это же имя переменной в следующем переборе мы каждой итерацией перезаписываем последний элемент исходного массива по ссылке вплоть до предпоследнего. Все проблемы из-за отсутствия четкой типизации в языке.
Для быстрого фикса подобной проблемы нужно между первым и вторым циклом выполнить unset($b);.
UPD: Благодаря комментарию юзера xpurpur стало известно, что проблема стара и даже описана в мануале.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.