En Excel, los nombres de las columnas son caracteres de la A a la Z, si se necesitan más columnas, continúa con AA, AB ...
Quiero escribir una función que convierta números enteros en esos nombres de columna de Excel.
0 .... A 25 ... Z 26 ... AA La solución que se me ocurrió es trabajar hasta AZ , pero quiero que funcione más.
function indexToXlxsColumn($index, $prefix="") { if($index < 26) { return $prefix.chr($index+65); }else{ return indexToXlxsColumn($index % 26, "A"); } }¿Cómo adaptar esta función para que funcione para cada índice sin producir código de espagueti ?
Aquí está el problema
return indexToXlxsColumn($index % 26, "A");Si establece el prefijo del siguiente piso en A, ¿qué sucede cuando tiene una entrada = 53? El resultado debería ser "BB".
código en papel
function indexToXlxsColumn($index, $prefix="") { if($index < 26) // 53 isnt less then 26 // second loop , 1 is less then 26 { return $prefix.chr($index+65); // $prefix = A // chr($index+65) = B // return "A"."B" ; }else{ return indexToXlxsColumn($index % 26, "A"); // indexToXlxsColumn(53 % 26, "A") -> (1, "A") } }---ACTUALIZAR---
Sigue el ask aqui esta la respuesta
function indexToXlxsColumn($index, $suffix ="") { if($index < 26){ return chr($index+65).$suffix ; } return indexToXlxsColumn(($index - $index%26)/26-1, chr($index%26+65).$suffix ); }Yo lo haría un poco diferente. Me molestó trabajar con chr(). Entonces, una vez almacené el alfabeto en una cadena y lo iteré hasta que el índice se resolvió con éxito.
<?php function getIn($i) { $str = 'abcdefghijklmnopqrstuvwxyz'; $r = (int) floor($i / 26) ; $c = $i % 26; return ($r) < 1 ? $str[$c] : $str[$r-1] . $str[$c]; } echo getIn(52); // output: "ba" function getIn($i) { $str = 'abcdefghijklmnopqrstuvwxyz'; $r = (int) floor($i / 26); $rr = $r >= 27 ? $r - 27 : null; $c = $i % 26; if ( $rr !== null) { return $str[$c] : $str[$r-1] . $str[$c]; } return ($r) < 1 ? $str[$c] : $str[$r-1] . $str[$c]; } echo getIn(800); // ddu echo getIn(1377); // zzzUna de las implementaciones:
function indexToXlxsColumn($index) { $name = ''; while($index > 0) { $mod = ($index - 1) % 26; $name = chr(65 + $mod).$name; $index = (int)(($index - $mod) / 26); } return $name; } // echo indexToXlxsColumn(26); // Z echo indexToXlxsColumn(33); // AG // echo indexToXlxsColumn(800); // ADT