Подтвердить что ты не робот

Диапазон PHP() от A до ZZ?

Можно ли получить диапазон с PHP от A до ZZ *?

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

Для меня это не сработало:

range('A', 'ZZ');

Это для PHPExcel, когда он дает BE как самое высокое поле, я бы пробежал все колоны. В этом случае я получаю только A, B:

range ('A', 'BE')
4b9b3361

Ответ 1

Просто попробуй это (проверенный рабочий режим)

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

скопирован из http://php.net/range

Ответ 2

Воспользуйтесь возможностью PHP для увеличения символов "perl-style"

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

Но вы также можете использовать простые целочисленные значения и воспользоваться встроенным PHPExcel встроенным методом PHPExcel_Cell:: stringFromColumnIndex()

ИЗМЕНИТЬ

Из PHP 5.5 вы также можете использовать генераторы, чтобы избежать фактического построения массива в памяти

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

foreach (excelColumnRange('A', 'ZZ') as $value) {
    echo $value, PHP_EOL;
}

Ответ 3

Вы можете комбинировать две петли foreach, чтобы создать что-то подобное.

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

Ответ 4

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

работает

Ответ 5

Это невозможно при использовании встроенного range:

Поддержка последовательностей символов и декрементных массивов была добавлена ​​в 4.1.0. Значения последовательности символов ограничены длиной одного. Если введена длина больше единицы, используется только первый символ.

Однако, по существу, вы здесь делаете подсчет вверх от 1 в числовой системе, которая использует 26 цифр a до z. Таким образом, вы можете быстро взломать решение путем подсчета, преобразования в базу 26 (который использует цифры 0 до 9 и a до p), а затем "перевод" цифр в диапазон a до z.

Ответ 6

Вы могли бы, конечно, написать свою собственную функцию, чтобы сделать это, поскольку кажется, что функция range() в php не поддерживает это. Это должно быть простой задачей, поскольку вы можете просто вложить функцию диапазона в другой цикл. Что-то вроде этого:

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

Ответ 7

Даже лучший вариант (отлично работает)

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

Ответ 8

Используйте эту рекурсивную функцию для получения точного диапазона от A до 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;
}

функция вызова как.

print_r(myRange('ZZ'));

даст вам результат

а В С , , , ZX З.Ы. ZZ

Ответ 9

Это насколько я могу вам помочь (сгенерируйте массив с A по Z).

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

Отъезд chr и array_walk

Ответ 10

Я использую alpha2num(), чтобы преобразовать альфа в число, а затем использовать его в цикле. С этим я могу получить диапазон, используя любое значение для начала и конца.

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