Диапазон PHP() от A до ZZ?
Можно ли получить диапазон с PHP от A до ZZ *?
a b c... aa... zx zy zz
Для меня это не сработало:
range('A', 'ZZ');
Это для PHPExcel, когда он дает BE как самое высокое поле, я бы пробежал все колоны. В этом случае я получаю только A, B:
range ('A', 'BE')
Ответы
Ответ 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'));