Ronn0
Ronn0

Reputation: 2259

PHP range() from A to ZZ?

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')

Upvotes: 36

Views: 49096

Answers (18)

Keshav Kunthe
Keshav Kunthe

Reputation: 1

Use This code...

$extra_alpha1= range('A', 'Z');
$extra_alpha=array("AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ");
$alphabetArray=array_merge($extra_alpha1,$extra_alpha);

Upvotes: -2

dian nurdiana
dian nurdiana

Reputation: 1

    $arr = [];
    foreach (range('A', 'Z') as $alphabeta) {
        $arr[] = $alphabeta;
    }
    foreach ($arr as $key => $val) {
        foreach (range('A', 'Z') as $alphabetb) {
            $arr[] = $arr[$key] . $alphabetb;
        }
    }
    print_r($arr);

Upvotes: 0

Aldo
Aldo

Reputation: 923

If you don't know to which letter you have to get, but you do know the length:

$max = 200; 
for ($l = 'A', $i = 0; $i < $max; $l++, $i++) {
    $letters[] = $l;
}
echo $letters; 

Upvotes: 0

Mohamad Hamouday
Mohamad Hamouday

Reputation: 2753

This works well for me.

function create_columns_range($start = 'A', $end = 'ZZ'){
    $return_range = [];
    for ($i = $start; $i !== $end; $i++){
        $return_range[] = $i;
    }
    return $return_range;
}

To use it just call:

$range = create_columns_range('A', 'ZZ');
print_r(range);

Upvotes: 0

Zahid Gani
Zahid Gani

Reputation: 165

$alfabet=["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","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DD","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ"];

 $active_row_value_fulladdress = "AA - AM";
 //$active_row_value_fulladdress = "A - F";
 $taken_full = strtoupper($active_row_value_fulladdress);

$taken_full_ar = explode("-", $taken_full);
$start = trim($taken_full_ar[0]);
$end   = trim($taken_full_ar[1]);

$alfabet_key = array_flip($alfabet);
$start1 = $alfabet_key[$start];
$end1   = $alfabet_key[$end];

for($i=$start1;$i<=$end1;$i++)
{
    $taken_full_array[]=$alfabet[$i];
}

foreach ($taken_full_array as $key => $value) 
{
    $full_add[]=array_search($value,$alfabet);
}

echo "<pre>";
print_r($taken_full_array);
print_r($full_add);

Upvotes: -1

user1062954
user1062954

Reputation: 17

$abc = [];
foreach(range('A', 'Z') as $first) {
    array_push($abc, $first);
}

foreach(range('A', 'Z') as $second) {
  foreach(range('A', 'Z') as $third) {      
      array_push($abc, $second.$third);
  }
}

$headers = ['CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO', 'CAMPO'];

foreach($headers as $key => $value) {
  echo $abc[$key] . ' - ' . $value . PHP_EOL;
}

Upvotes: -1

JaeHun
JaeHun

Reputation: 1

$atoz = range('A', 'Z');
$target = range('A', 'Z');

$result = $atoz;
foreach ($target as $val) {
    $step = array_map(function ($elem) use ($val) {
            return $val. $elem;
        }, $atoz);

    $result = array_merge($result, $step);
}

Upvotes: -1

Mayur Chauhan
Mayur Chauhan

Reputation: 731

Here is a simplified solution in which you can define number of rows and columns you want to generate. This way you will allocate lesser memory.

// Get cell names for excel
function generate_excel_cell_names($row_cnt, $col_cnt){
    $excel_cells = [];

    // Note: Row and col indexes are starting from 1
    for ($excel_row=1; $excel_row <= $row_cnt; $excel_row++) { 
        $excel_col = 'A';
        for ($col_index = 1; $col_index <= $col_cnt; $col_index++)
        {
            $excel_cells[$excel_row][$col_index] = $excel_col.$excel_row;
            $excel_col++;
        }
    }
    return $excel_cells;
}

Upvotes: 0

Shailesh Sonare
Shailesh Sonare

Reputation: 3121

Please check this simple solution incrementing char.

How to list from A to Z in PHP, and then on to AA, AB, AC, etc

Use this recursive function to get the exact range from A to ZZ

function myRange($end_column = '', $first_letters = '') {
    $columns = array();
    $length = strlen($end_column);
    $letters = range('A', 'Z');

    // Iterate over 26 letters.
    foreach ($letters as $letter) {
      // Paste the $first_letters before the next.
      $column = $first_letters . $letter; 
      // Add the column to the final array.
      $columns[] = $column;
      // If it was the end column that was added, return the columns.
      if ($column == $end_column)
          return $columns;
    }

    // Add the column children.
    foreach ($columns as $column) {
      // Don't itterate if the $end_column was already set in a previous itteration.
      // Stop iterating if you've reached the maximum character length.
      if (!in_array($end_column, $columns) && strlen($column) < $length) {
          $new_columns = myRange($end_column, $column);
          // Merge the new columns which were created with the final columns array.
          $columns = array_merge($columns, $new_columns);
      }
    }

    return $columns;
}

call function like.

print_r(myRange('ZZ'));

will give you result

A B C . . . ZX ZY ZZ

Upvotes: 1

Tarilo
Tarilo

Reputation: 430

You could ofcourse write your own function to do this as it seems that the range() function in php doesn't support this. This should be an easy job, since you can just nest the range function in another loop. Something like this:

foreach(range('a', 'z') as $outer) {
  foreach(range('a', 'z') as $inner) {
    print($outer.$inner);
  }
}

Upvotes: 1

Donot Don&#39;t
Donot Don&#39;t

Reputation: 649

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

Upvotes: 19

Mark Baker
Mark Baker

Reputation: 212412

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;
}

Upvotes: 72

Zan Asmon
Zan Asmon

Reputation: 1

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'));

Upvotes: -1

Suresh Kamrushi
Suresh Kamrushi

Reputation: 16086

Even better option (Working great)

for ($i = 'a'; $i < 'zz'; $i++) 
    echo $i."<br>";

Upvotes: 2

Oldskool
Oldskool

Reputation: 34837

You can combine two foreach loops to generate something like that.

// Single letters
foreach(range('A', 'Z') as $letter) {
    echo $letter;
}

// AA-ZZ combinations
foreach(range('A', 'Z') as $letter1) {
    foreach(range('A', 'Z') as $letter2) {
        echo $letter1 . $letter2;
    }
}

Upvotes: 8

Suresh Kamrushi
Suresh Kamrushi

Reputation: 16086

Just Try this- (tested working fine)

function createColumnsArray($end_column, $first_letters = '')
{
  $columns = array();
  $length = strlen($end_column);
  $letters = range('A', 'Z');

  // Iterate over 26 letters.
  foreach ($letters as $letter) {
      // Paste the $first_letters before the next.
      $column = $first_letters . $letter;

      // Add the column to the final array.
      $columns[] = $column;

      // If it was the end column that was added, return the columns.
      if ($column == $end_column)
          return $columns;
  }

  // Add the column children.
  foreach ($columns as $column) {
      // Don't itterate if the $end_column was already set in a previous itteration.
      // Stop iterating if you've reached the maximum character length.
      if (!in_array($end_column, $columns) && strlen($column) < $length) {
          $new_columns = createColumnsArray($end_column, $column);
          // Merge the new columns which were created with the final columns array.
          $columns = array_merge($columns, $new_columns);
      }
  }

  return $columns;
}
echo "<pre>";
print_r( createColumnsArray('BZ'));

copied from http://php.net/range

Upvotes: 18

Vlad Preda
Vlad Preda

Reputation: 9910

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

Upvotes: -1

Jon
Jon

Reputation: 437376

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.

Upvotes: 2

Related Questions