Ci sono diversi problemi.

Prima di tutto count() restituisce il numero di valori contenuti in un array, ma l'ultimo elemento ha indice count($array) - 1, non count($array) visto che gli indici degli array iniziano da 0.

Poi tu usi unset che ti puo' creare dei buchi, percio' hai bisogno di reindicizzare l'array. Per fare cio' puoi usare array_values().

Altro problema e' che tu nella condizione del while usi due quantita' variabili: $index2 che cresce e count($elenco) che decresce, quindi al massimo otterrai un array che e' lungo meta' dell'originale.

Ultima cosa, PHP fornisce una funzione apposta per questa cosa: http://it.php.net/manual/en/function.shuffle.php