PHP range() from A to ZZ?

2020-01-29 05:58发布

Is it possible to get a range with PHP from A to ZZ*?

a b c ... aa ... zx zy zz

For me this didn't work:

range('A', 'ZZ');

It's for PHPExcel, when it gives BE as highest field i'd run through all colums. In this case i only get A, B:

range ('A', 'BE')

标签: php range
11条回答
Root(大扎)
2楼-- · 2020-01-29 06:08

I use alpha2num() to convert alpha to number and then use it in loop. With this I can get the range using any value for the start and end.

// to convert alpha to number
function alpha2num($a) {
    $l = strlen($a);
    $n = 0;
    for($i = 0; $i < $l; $i++)
        $n = $n*26 + ord($a[$i]) - 0x40;

    return $n-1;
}

// to convert number back to alpha
function num2alpha($n)
{
    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
    $r = chr($n%26 + 0x41) . $r;
    return $r;
}

function get_range($start_column, $end_column)
{
    $s = alpha2num($start_column); // get start number
    $e = alpha2num($end_column); // get end num

    $columns = array();

    // loop from start to end and change back the number to alpha to be stored in array
    for($i=$s; $i<=$e; $i++)
        $columns[] = num2alpha($i);

    return $columns;
}

// usage
$columns = get_range('Z', 'BA'));
查看更多
欢心
3楼-- · 2020-01-29 06:13

It's not possible with the built-in range:

Support for character sequences and decrementing arrays was added in 4.1.0. Character sequence values are limited to a length of one. If a length greater than one is entered, only the first character is used.

However, in essence what you are doing here is counting upwards from 1 in a numeric system that uses the 26 digits a to z. So you can quickly hack together a solution by counting, converting to base 26 (which uses the digits 0 to 9 and a to p) and then "translating" the digits to the range a to z.

查看更多
叼着烟拽天下
4楼-- · 2020-01-29 06:15
for ($i = 'A'; $i !== 'AC'; $i++){
    echo $i.', '; //A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB,
}

it's working

查看更多
该账号已被封号
5楼-- · 2020-01-29 06:17

This is as far as I can help you (generate array with A through Z).

$a = range(65, 90);
array_walk($a, 'chr');

Check out chr and array_walk

查看更多
混吃等死
6楼-- · 2020-01-29 06:20

Even better option (Working great)

for ($i = 'a'; $i < 'zz'; $i++) 
    echo $i."<br>";
查看更多
一夜七次
7楼-- · 2020-01-29 06:26

Take advantage of PHP's ability to increment characters "perl-style"

$letters = array();
$letter = 'A';
while ($letter !== 'AAA') {
    $letters[] = $letter++;
}

But you could also use simple integer values, and take advantage of PHPExcel's built-in PHPExcel_Cell::stringFromColumnIndex() method

EDIT

From PHP 5.5, you can also use Generators to avoid actually building the array in memory

function excelColumnRange($lower, $upper) {
    ++$upper;
    for ($i = $lower; $i !== $upper; ++$i) {
        yield $i;
    }
}

foreach (excelColumnRange('A', 'ZZ') as $value) {
    echo $value, PHP_EOL;
}
查看更多
登录 后发表回答