Lo que veo que estás haciendo es:
Cuando k = 2, se entra en el if.
Por lo tanto se entra también en el for.
dentro del for, se da el valor "hola" a nvalor1 y nvalor2
Eso es lo que hace tu código, no hay errores.
Lo que querés es que las variables vacías no las tome, eso se hace de otra forma:
Código PHP:
$i = 1;
$j = 1;
while( isset(${'valor'.$i}) )
{
if (!empty(${'valor'.$i}))
{
${'nvalor'.$j} = ${'valor'.$i};
$j++;
}
$i++;
}
echo $nvalor1;
echo $nvalor2;
Con esto se recorren todas las $valor, asignando solo cuando la variable no está vacía, e incrementando $j (el índice de la "siguiente" $nvalor) si se hace una asignación.
Saludos.