Это потому, что вы удаляете элементы во время их итерации.
array = [1, 2]
^ // pointer in first iteration
eliminate 1
array = [2]
^ // the pointer remains in the same location
//ups! out of the loop. all items were visited.
Вы можете скопировать массив перед тем, как выполнить его итерацию, итерировать копию или пометить индексы, чтобы удалить и удалить их позже, или повторить массив в обратном направлении.
PS: Извините за мой плохой английский.