Tôi đang làm việc trên một tập lệnh tạo một số tài liệu Excel và tôi cần chuyển một số thành tên cột tương đương của nó. Ví dụ:
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
Tôi đã viết một thuật toán để làm như vậy, nhưng tôi muốn biết liệu cách làm đơn giản hơn hay nhanh hơn:
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;
}
Bạn có biết một cách tốt hơn để làm điều đó? Có lẽ một cái gì đó để giữ cho nó đơn giản hơn? hoặc cải thiện hiệu suất?
Biên tập
Việc triển khai của ircmaxell hoạt động khá tốt. Nhưng, tôi sẽ thêm đoạn ngắn hay này:
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}