range()
La funzione range() in PHP genera un array con una sequenza di elementi tra un valore iniziale e uno finale, con passo opzionale.
Introduzione
range() è una funzione PHP integrata che costruisce un array contenente una sequenza di elementi da un valore iniziale a un valore finale. Invece di scrivere un ciclo per inserire numeri o lettere in un array uno per uno, si descrivono i punti estremi (e facoltativamente un passo) e PHP riempie tutto ciò che sta nel mezzo.
Questa pagina tratta la sintassi, ogni tipo di range generabile (crescente, decrescente, interi, float e caratteri), le insidie più comuni e dove range() si inserisce nel codice reale.
Sintassi
range(string|int|float $start, string|int|float $end, int|float $step = 1): arrayDove:
$start: Il primo valore della sequenza.$end: L'ultimo valore della sequenza.$step: Facoltativo. La quantità aggiunta tra i valori. Il valore predefinito è1. Deve essere un numero positivo —range()determina la direzione da$starte$end, non dal segno del passo.
Due cose vale la pena memorizzare subito:
- Entrambi gli estremi sono inclusi.
range(0, 5)restituisce sei elementi (da0a5), non cinque. - Il risultato è sempre un nuovo array indicizzato da zero — le chiavi sono
0, 1, 2, …indipendentemente dai valori al suo interno.
Esempi
Generare numeri da 0 a 5
La chiamata più semplice accetta un inizio e una fine. Notare che 5 è incluso nel risultato:
Output:
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
)Usare numeri negativi
$start e $end possono essere negativi, e la sequenza avanza comunque di 1:
Output:
Array
(
[0] => -5
[1] => -4
[2] => -3
[3] => -2
[4] => -1
[5] => 0
[6] => 1
[7] => 2
[8] => 3
[9] => 4
[10] => 5
)Saltare valori con un passo
Il terzo argomento imposta l'incremento. Qui è 2, quindi vengono prodotti solo i numeri pari:
Output:
Array
(
[0] => 0
[1] => 2
[2] => 4
[3] => 6
[4] => 8
[5] => 10
)Generare un range di caratteri
Quando $start e $end sono singoli caratteri, range() percorre l'alfabeto tra di essi. Questo è utile per costruire menu A–Z, etichette di colonne o dati di test:
Output:
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
[6] => g
[7] => h
[8] => i
[9] => j
[10] => k
[11] => l
[12] => m
[13] => n
[14] => o
[15] => p
[16] => q
[17] => r
[18] => s
[19] => t
[20] => u
[21] => v
[22] => w
[23] => x
[24] => y
[25] => z
)Conto alla rovescia con un range decrescente
Se $start è maggiore di $end, range() conta automaticamente al contrario. Non si passa un passo negativo — il passo rimane positivo:
<?php
$countdown = range(5, 1);
print_r($countdown);Output:
Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
[4] => 1
)Usare un passo float
Il passo può essere un float, il che consente di costruire sequenze frazionarie — utile per cursori, assi di grafici o valori campionati:
<?php
$fractions = range(0, 1, 0.25);
print_r($fractions);Output:
Array
(
[0] => 0
[1] => 0.25
[2] => 0.5
[3] => 0.75
[4] => 1
)Insidie comuni
- Il range è inclusivo.
range(1, 3)restituisce[1, 2, 3]. Se ci si aspettava un risultato di lunghezza pari a$end, si sarà fuori di uno. - Mantenere il passo positivo. La direzione è determinata dall'ordine di
$starte$end. Passare un passo negativo (ad esempiorange(0, 5, -1)) è un errore — le versioni PHP precedenti emettevano un avviso, mentre PHP 8.3+ lancia unValueError. Anche un passo di0non è valido. - L'ultimo elemento potrebbe essere saltato.
range(0, 10, 3)produce[0, 3, 6, 9]—10non è raggiungibile da0con passi di3, quindi la sequenza si ferma all'ultimo valore che rientra. - I float possono essere imprecisi. Poiché i numeri in virgola mobile non possono rappresentare esattamente ogni decimale, un passo come
0.1potrebbe non atterrare sul valore atteso. Arrotondare i risultati, oppure iterare sugli interi e dividere in seguito, quando la precisione è importante. - La memoria cresce con la dimensione.
range(0, 1000000)costruisce un array da un milione di elementi in memoria. Se si ha solo bisogno di iterare, un cicloforoSplFixedArrayevita l'allocazione.
Quando usare range()
range() è ideale ogni volta che si ha bisogno di una sequenza già pronta anziché di un contenitore vuoto:
- Per guidare un ciclo. Combinarlo con
foreachper iterare su un intervallo fisso:foreach (range(1, 12) as $month) { … }. - Per costruire liste di opzioni — anni, giorni del mese, o lettere da
AaZper un menu a tendina. - Per abbinarlo a
array_map()per trasformare ogni valore, ad esempioarray_map(fn($n) => $n * $n, range(1, 5))per i quadrati.
Se invece si desidera un array con lo stesso valore ripetuto, è preferibile usare array_fill() anziché range(). Per ulteriori informazioni sugli array in generale, consultare la guida agli array PHP.
Riepilogo
range() crea un array indicizzato da zero di valori sequenziali tra due estremi. Funziona con interi, float e caratteri, conta in su o in giù e accetta un passo opzionale. Ricordare che entrambi gli estremi sono inclusivi, il passo è sempre positivo e i range di grandi dimensioni allocano vera memoria — e diventa una delle one-liner più comode di PHP.