Completed
Push — master ( 2d297e...16a2f9 )
by Adrien
02:10
created

CellHelper::getColumnLettersFromColumnIndex()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 22
ccs 11
cts 11
cp 1
rs 9.568
c 0
b 0
f 0
cc 3
nc 2
nop 1
crap 3
1
<?php
2
3
namespace Box\Spout\Writer\Common\Helper;
4
5
/**
6
 * Class CellHelper
7
 * This class provides helper functions when working with cells
8
 */
9
class CellHelper
10
{
11
    /** @var array Cache containing the mapping column index => column letters */
12
    private static $columnIndexToColumnLettersCache = [];
13
14
    /**
15
     * Returns the column letters (base 26) associated to the base 10 column index.
16
     * Excel uses A to Z letters for column indexing, where A is the 1st column,
17
     * Z is the 26th and AA is the 27th.
18
     * The mapping is zero based, so that 0 maps to A, B maps to 1, Z to 25 and AA to 26.
19
     *
20
     * @param int $columnIndexZeroBased The Excel column index (0, 42, ...)
21
     *
22
     * @return string The associated cell index ('A', 'BC', ...)
23
     */
24 37
    public static function getColumnLettersFromColumnIndex($columnIndexZeroBased)
25
    {
26 37
        $originalColumnIndex = $columnIndexZeroBased;
27
28
        // Using isset here because it is way faster than array_key_exists...
29 37
        if (!isset(self::$columnIndexToColumnLettersCache[$originalColumnIndex])) {
30 7
            $columnLetters = '';
31 7
            $capitalAAsciiValue = ord('A');
32
33
            do {
34 7
                $modulus = $columnIndexZeroBased % 26;
35 7
                $columnLetters = chr($capitalAAsciiValue + $modulus) . $columnLetters;
36
37
                // substracting 1 because it's zero-based
38 7
                $columnIndexZeroBased = (int) ($columnIndexZeroBased / 26) - 1;
39 7
            } while ($columnIndexZeroBased >= 0);
40
41 7
            self::$columnIndexToColumnLettersCache[$originalColumnIndex] = $columnLetters;
42
        }
43
44 37
        return self::$columnIndexToColumnLettersCache[$originalColumnIndex];
45
    }
46
}
47