Saya sedang mengerjakan skrip yang menghasilkan beberapa dokumen Excel dan saya perlu mengonversi angka menjadi nama kolom yang setara. Sebagai contoh:
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
Saya sudah menulis algoritme untuk melakukannya, tetapi saya ingin tahu apakah cara yang lebih sederhana atau lebih cepat untuk melakukannya:
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;
}
Apakah Anda tahu cara yang lebih baik untuk melakukannya? Mungkin sesuatu untuk membuatnya lebih sederhana? atau peningkatan kinerja?
Edit
Implementasi ircmaxell bekerja dengan baik. Tapi, saya akan menambahkan pendek yang bagus ini:
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}
php
algorithm
optimization
Cristian
sumber
sumber
Jawaban:
Berikut adalah fungsi rekursif sederhana yang bagus (Berdasarkan angka indeks nol, artinya 0 == A, 1 == B, dll) ...
Dan jika Anda ingin diindeks (1 == A, dll):
Diuji dengan angka dari 0 hingga 10000 ...
sumber
Menggunakan PhpSpreadsheet ( PHPExcel tidak digunakan lagi )
Catatan indeks 0 menghasilkan 'Z'
https://phpspreadsheet.readthedocs.io/en/develop/
Jawaban yang benar (jika Anda menggunakan PHPExcel Library) adalah:
dan mundur:
sumber
PHPExcel_Cell::stringFromColumnIndex(1)
memang kembali'B'
, harap edit jawaban Anda.Diindeks untuk 1 -> A, 2 -> B, dll
Diindeks untuk 0 -> A, 1 -> B, dll
Mengambil keuntungan dari fakta bahwa PHP mengikuti konvensi Perl ketika berhadapan dengan operasi aritmatika pada variabel karakter dan bukan pada C. Perhatikan bahwa variabel karakter bisa bertambah tapi tidak bisa dikurangi.
sumber
Ini akan dilakukan untuk konversi (dengan asumsi aritmatika integer), tapi saya setuju dengan poster lain; gunakan saja
base_convert
sumber
B
untuk$number = 1
bukanA
karena1 % 26
is1
Jawaban terlambat, tapi inilah yang saya lakukan (untuk 1 == A diindeks):
Kemudian jika Anda ingin mengonversi dengan cara lain:
sumber
Angka diubah menjadi huruf kolom Excel:
ex:
Huruf kolom Excel diubah menjadi angka:
ex:
sumber
sumber
Menggabungkan jawaban rekursif ircmaxell, saya punya yang ini:
Saya menggunakan pengindeksan default sebagai berbasis 0, tetapi ini bisa berupa bilangan bulat positif saat menyulap array di PHP.
sumber
Saya tidak pernah menggunakan ini dalam produksi karena tidak dapat dibaca, tapi untuk kesenangan ... Hanya sampai ZZ.
sumber
Untuk siapa pun yang mencari implementasi Javascript ini, berikut adalah jawaban @ ircmaxell di Javascript ..
sumber