Pregunta básica: ¿sabes qué significa "pasar variables por referencia" o no?
En el caso "MAL" sucede porque la función end() trabaja únicamente con variables por referencia, eso lo puedes consultar en el manual.
Y funciona el "BIEN" porque almacenamos el resultado de explode() en una variable, y después usamos esa variable con end() lo cual subsana el error.
¿Se entiende?