Je travaille sur un script qui génère certains documents Excel et j'ai besoin de convertir un nombre en son équivalent en nom de colonne. Par exemple :
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
J'ai déjà écrit un algorithme pour le faire, mais j'aimerais savoir s'il existe des moyens plus simples ou plus rapides de le faire :
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;
}
Connaissez-vous un meilleur moyen de le faire ? Peut-être quelque chose de plus simple ? ou une amélioration des performances ?
Modifier
L'implémentation d'ircmaxell fonctionne très bien. Mais, je vais ajouter ce petit truc sympa :
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}
3 votes
Le premier commentaire de cette page de manuel pourrait être utile : php.net/manual/fr/function.base-convert.php#96304
0 votes
Wow ! C'est une courte mise en œuvre. Merci !
0 votes
Avez-vous examiné les bibliothèques existantes pour générer des documents Excel à partir de PHP ?
0 votes
Oui... bien sûr. J'utilise ta super bibliothèque, Mark. J'aime juste améliorer mes compétences en matière d'écriture d'algorithmes... ce qui est bien, c'est qu'après en avoir terminé un, vous pouvez trouver d'autres algorithmes qui font exactement la même chose mais qui sont plus courts.
2 votes
Votre algorithme court utilise 0 -> A plutôt que 1 -> A dans votre requête, légèrement différente de la requête... si c'est ce que vous voulez, regardez la méthode PHPExcel_Cell::stringFromColumnIndex() de PHPExcel, bien que votre implémentation de num2alpha() puisse être plus rapide... Je vais faire quelques tests, et je pourrais l'"emprunter" (avec la permission).
1 votes
Résultats des tests de chronométrage : Le temps d'appel pour 1 048 576 itérations de la méthode stringFromColumnIndex() de PHPExcel était de 12,9545 secondes. Le temps d'appel pour 1 048 576 itérations de la méthode num2Alpha() était de 16,0076 secondes.
0 votes
Wow... alors, je vais utiliser ton implémentation, Mark. Quoi qu'il en soit, c'était vraiment amusant d'essayer de coder cet algorithme :D
0 votes
Le temps d'appel pour 1 048 576 itérations de la méthode num2alpha() était de 5,6754 secondes ; le temps d'appel pour 1 048 576 itérations de la méthode stringFromColumnIndex() de PHPExcel était de 7,7286 secondes.