en realidad es un solo bucle, de la
A a la
Z y lo repites de derecha a izquierda como tantas combinaciones que haga...
osea... en este caso tan solo serían dos bucles... obviamente el último de la derecha siempre debe ser primero, y se anida al final... es una cuestión recursiva también, etc...
no digo que sea sencillo, pero si tienes experiencia con array podrías usar
range()
http://php.net/range