Al usar el foearch junto a splice has cometido el error mas típico. Ya comenté que para eliminar con splice elementos de un array, hay que recorrerlo al revés para no tener problemas.
Cita:
Iniciado por marlanga Notar que para borrar posiciones de un array usando un sólo for, hay que recorrerlo al revés; porque al eliminar algún elemento del array, el "for" llegaría hasta índices que ya no existen.
Así que ya ves, no me convence del todo eso de que ratificas y refutas afirmaciones. Splice es de lo mejor para borrar posiciones, siempre que sepas lo que estás haciendo. También el método filter, que éste sí, es polivalente: vale tanto para arrays como para arrays asociativos-objetos, aunque lo que hace es devolver una copia sin modificar el original.
http://jsfiddle.net/marlanga/yCwNZ/