La solución en PHP, por si alguien la necesita. Ví en la función
chr() que lo intentaban.. yo sin embargo uso la función
base_convert(), como lo hice con toString() en JS:
Código PHP:
function base_convert2($n,$b) { //asumo que desde la base que queremos transformar es desde decimal
if( 0<=$n && $n<$b ) { //caso directo, no hay que hacer nada, devuelve bien
$res=base_convert($n,10,$b);
}
else { //caso general
//el ultimo se mantiene como se transformaria
$ultimo=base_convert($n,10,$b);
$ultimo=substr($ultimo, -1, 1); //ultimo caracter
//los primeros (sean cuantos sean) se resuelven recursivamente, hasta llegar a un caso directo
$aConvertir=(int)($n/$b)-1;
$primeros=base_convert2($aConvertir,$b);
$res=$primeros.$ultimo; //siendo primeros y ultimo strings
}
return $res;
}
$YOdevuelvo=split(" " , "a b c d e f g h i j k l m n o p q r s t u v w x y z");
$ELdevuelve="0123456789abcdefghijklmnop";
function num2alpha($n, $b=26 ) {
global $YOdevuelvo, $ELdevuelve;
$bc=base_convert2($n, strlen($ELdevuelve) );
for($a=0, $dev="";$a<strlen($bc);$a++) {
// la posicion de cada caracter en ELdevuelve es la letra en $YOdevuelvo
$pos=strpos($ELdevuelve, $bc[$a]);
$dev.=$YOdevuelvo[$pos];
}
return $dev;
}
function alpha2num($alpha, $b=26 ) {
global $YOdevuelvo;
$YOdevuelvoSTR=implode("",$YOdevuelvo);
for($a=0,$dev=0; $a<strlen($alpha);$a++) {
// orden: unidades=0; decenas=1; centenas=2 ...
$orden=strlen($alpha)-$a-1;
$pos=strpos($YOdevuelvoSTR, $alpha[$a] ); //posicion de la letra con respecto a $YOdevuelvo
if($orden==0)
$dev+=$pos; //haría pow($base,$orden), pero daría 1 en vez de 0
else
$dev+=pow($b,$orden)*($pos+1);
}
return $dev;
}
Código PHP:
echo alpha2num("hola")."<br/>"; //151060
echo num2alpha(151060)."<br/>"; //hola
Tiene un par de problemas cuando tiene que trabajar con cifras grandes, no se puede traducir a numero "permutaciones" porque daría una combinación demasiado alta para un entero supongo (3.4319006077858E+017) y perdemos la precisión.
Pero creo que hasta que la cadena a devolver fuera de 8 caracteres
num2alpha() funciona, más no. Con
alpha2num() no he encontrado restricciones.
Saludos foreros.