web-dev-qa-db-fra.com

PHP gamme () de A à ZZ?

Est-il possible d'obtenir une plage avec PHP de A à ZZ *?

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

Pour moi cela n'a pas fonctionné:

range('A', 'ZZ');

C’est pour PHPExcel, quand il donneSOITcomme champ le plus élevé, j’ai parcouru toutes les colonnes. Dans ce cas, je n’obtiens que A, B:

range ('A', 'BE')
22
Ronn0

Essayez juste ceci - (testé fonctionne bien)

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

copié de http://php.net/range

13
Suresh Kamrushi

Tirez parti de la capacité de PHP à incrémenter des caractères "à la Perl"

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

Mais vous pouvez également utiliser des valeurs entières simples et tirer parti de la méthode PHPExcel_Cell :: stringFromColumnIndex () intégrée à PHPExcel.

MODIFIER

À partir de PHP 5.5, vous pouvez également utiliser des générateurs pour éviter de créer le tableau en mémoire.

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

foreach (excelColumnRange('A', 'ZZ') as $value) {
    echo $value, PHP_EOL;
}
42
Mark Baker
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,
}

ça marche

10
Donot Don't

Vous pouvez combiner deux boucles foreach pour générer quelque chose comme ça.

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

Ce n'est pas possible avec le range :

La prise en charge des séquences de caractères et des tableaux de décrémentation a été ajoutée dans 4.1.0. Les valeurs de séquence de caractères sont limitées à une longueur. Si une longueur supérieure à un est entrée, seul le premier caractère est utilisé.

Cependant, ce que vous faites ici consiste essentiellement à compter à partir de 1 dans un système numérique qui utilise les 26 chiffres a à z. Ainsi, vous pouvez rapidement pirater une solution en comptant, en convertissant en base 26 (qui utilise les chiffres 0 en 9 et a en p), puis en traduisant les chiffres dans la plage a en z.

2
Jon

Encore meilleure option (Travailler bien)

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

Veuillez vérifier cette solution simple incrémentant le caractère.

Comment lister de A à Z en PHP, puis AA, AB, AC, etc.

Utilisez cette fonction récursive pour obtenir la plage exacte de 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;
}

fonction d'appel comme.

print_r(myRange('ZZ'));

vous donnera le résultat

A B C

1
Shailesh Sonare

Vous pouvez bien sûr écrire votre propre fonction pour le faire car il semble que la fonction range () en php ne supporte pas cela. Cela devrait être un travail facile, puisque vous pouvez simplement imbriquer la fonction range dans une autre boucle. Quelque chose comme ça:

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

C'est aussi loin que je peux vous aider (générer un tableau avec A à Z). 

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

Découvrez chr et array_walk

0
Vlad Preda

J'utilise alpha2num () pour convertir alpha en nombre, puis l'utiliser en boucle. Avec cela, je peux obtenir la plage en utilisant n'importe quelle valeur pour le début et la fin.

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

Voici une solution simplifiée dans laquelle vous pouvez définir le nombre de lignes et de colonnes que vous souhaitez générer. De cette façon, vous allouerez moins de mémoire.

// 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;
}
0
Mayur Chauhan