Как всегда, есть несколько способов решить то, что вы просите, это только один способ, используя один счетчик на символ в выходной строке:
$c = "abc"; // charset
$l = 2; // string length
for($t='',$cl=strlen($c),$s=array_fill(0,$l,0),$i=pow($cl,$l);$a=0,$i--;) {
for($t&&$t.=', ';$a<$l;$t.=$c[$s[$a++]]);
for(;$a--&&++$s[$a]==$cl;$s[$a]=0);
};
echo $t; // the string you asked for.
aa, ab, ac, ba,bb, bc, ca, cb, cc
Один основной цикл, один цикл для построения строки и один цикл для подсчета.
Я могу себе представить, что это должно работать с получением модулей для каждой позициивыходной строки.