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;
}
php
algorithm
optimization
Cristian
quelle
quelle
Antworten:
Hier ist eine schöne einfache rekursive Funktion (basierend auf null indizierten Zahlen, was 0 == A, 1 == B usw. bedeutet) ...
Und wenn Sie möchten, dass es indiziert wird (1 == A usw.):
Getestet mit Zahlen von 0 bis 10000 ...
quelle
Verwenden von PhpSpreadsheet ( PHPExcel ist veraltet )
Hinweis Index 0 ergibt 'Z'
https://phpspreadsheet.readthedocs.io/en/develop/
Die richtige Antwort (wenn Sie PHPExcel Library verwenden) lautet:
und rückwärts:
quelle
PHPExcel_Cell::stringFromColumnIndex(1)
in der Tat zurück'B'
, bitte bearbeiten Sie Ihre Antwort.Indiziert für 1 -> A, 2 -> B usw.
Indiziert für 0 -> A, 1 -> B usw.
Nutzt die Tatsache aus, dass PHP Perls Konvention folgt, wenn es um arithmetische Operationen mit Zeichenvariablen und nicht mit C geht. Beachten Sie, dass Zeichenvariablen inkrementiert, aber nicht dekrementiert werden können.
quelle
Dies reicht für die Konvertierung aus (unter der Annahme einer ganzzahligen Arithmetik), aber ich stimme den anderen Postern zu. benutz einfach
base_convert
quelle
B
für$number = 1
statt ,A
da1 % 26
heißt1
Späte Antwort, aber hier ist, was ich getan habe (für 1 == A indiziert):
Wenn Sie dann in die andere Richtung konvertieren möchten:
quelle
Zahlenkonvertierung in Excel-Spaltenbuchstaben:
Ex:
Excel-Spaltenbuchstaben werden in Zahlen konvertiert:
Ex:
quelle
quelle
Wenn ich die rekursive Antwort von ircmaxell kombiniere, habe ich folgende:
Ich verwende die Standardindizierung als 0-basiert, aber es kann eine beliebige positive Ganzzahl sein, wenn Sie mit Arrays in PHP jonglieren.
quelle
Ich würde das nie in der Produktion verwenden, weil es nicht lesbar ist, aber zum Spaß ... Nur bis zu ZZ.
quelle
Für alle, die nach einer Javascript- Implementierung suchen , ist hier die Antwort von @ ircmaxell in Javascript .
quelle