Ich arbeite an einem Skript, das einige Excel-Dokumente generiert, und ich muss eine Zahl in den entsprechenden Spaltennamen konvertieren. Beispielsweise:
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
Ich habe bereits einen Algorithmus dafür geschrieben, möchte aber wissen, ob es einfachere oder schnellere Möglichkeiten gibt:
function numberToColumnName($number){
$abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$abc_len = strlen($abc);
$result_len = 1; // how much characters the column's name will have
$pow = 0;
while( ( $pow += pow($abc_len, $result_len) ) < $number ){
$result_len++;
}
$result = "";
$next = false;
// add each character to the result...
for($i = 1; $i<=$result_len; $i++){
$index = ($number % $abc_len) - 1; // calculate the module
// sometimes the index should be decreased by 1
if( $next || $next = false ){
$index--;
}
// this is the point that will be calculated in the next iteration
$number = floor($number / strlen($abc));
// if the index is negative, convert it to positive
if( $next = ($index < 0) ) {
$index = $abc_len + $index;
}
$result = $abc[$index].$result; // concatenate the letter
}
return $result;
}
Kennen Sie einen besseren Weg, dies zu tun? Vielleicht etwas, um es einfacher zu halten? oder eine Leistungsverbesserung?
Bearbeiten
Die Implementierung von ircmaxell funktioniert ziemlich gut. Aber ich werde diesen schönen kurzen hinzufügen:
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}