Hi!
Das geht wohl optimaler. ;-)
Beispielsweise wie folgt. Wenn man Code wiederholen muss ist das ein Zeichen dafür, dass die aktuelle Lösung wohl nicht optimal ist.
function iterate_letters($deep, $prefix = '') {
if ($deep - 1) {
foreach (range('a', 'z') as $letter)
iterate_letters($deep - 1, $prefix . $letter);
} else {
foreach (range('a', 'z') as $letter)
echo "$prefix$letter\n";
}
}
iterate_letters(5);
Bei 4 Zeichen ist das Ganze noch erträglich, es werden aber immerhin schon 26^4 * 5 = 2'284'880 Zeichen übertragen (26^4 Zeilen à 4 Zeichen plus Zeilenumbruch). Bei 5 Zeichen sind es schon 71'288'256 und bei 6 sind es 2'162'410'432, also circa 2 GB.
Anstatt der beiden foreach-Schleifen gibt es sicher auch noch eine Lösung mit nur einer. Allerdings wollte ich das if nicht nach innen legen, weil das dann um eine Potenz öfter ausgeführt werden muss. Was aber vermutlich egal ist, weil der Großteil der Zeit für das Übertragen und Rendern im Browser draufgeht.
BTW, warum geht das nicht so?
for ($i = "a"; $i <= "z"; $i++) echo $i;
Das gibt erst wie erwartet a bis z aus, danach aber aa, ab, …, az, ba, …, yz, yy, yz.
Strings sind keine Zahlen. Zahlen werden nach links höherwertiger, Strings nach rechts. a bis y sind kleiner als z, z ist gleich z und erfüllt ebenfalls die Weiterlaufbedingung. aa bis yz sind wieder kleiner als z, erst za ist größer.
Lo!