I numeri interi in PHP: int, esempi e funzioni

In PHP tutti i numeri interi positivi e negativi vengono indicati con la parola chiave int: -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8.

In base al sistema in cui è installato PHP, è possibile rappresentare un numero intero positivo o negativo entro determinati limiti.

Su un sistema a 32-bit il numero intero positivo massimo rappresentabile è 2 147 483 648 e per i numeri negativi è -2 147 483 648.

Mentre su un sistema a 64-bit il numero massimo intero positivo rappresentabile è 18 446 744 073 709 552 000 e per quelli negativi è -18 446 744 073 709 552 000.

Questo è possibile calcolarlo con le seguenti formule:

  • numero massimo per i sistemi a 32 bit: 2^(32 – 1) (2 elevato alla 32 – 1)
  • numero massimo per i sistemi a 64 bit: 2^(64 – 1) (2 elevato alla 64 – 1)

Alternativamente, è possibile ottenere questi dati

Nota bene: In PHP si distinguono i numeri interi dai numeri decimali.

Definire un numero intero (int)

In PHP i numeri interi vengono definiti senza apici o doppi apici, bisogna semplicemente inserire il numero desiderato:

<?php

674;
56;
-83869;
5;
-17;

?>

In questo modo abbiamo definito dei numeri interi, ma non vengono mostrati sulla pagina web e non sono contenuti in una variabile.

Quindi, per visualizzarli sulla pagina web utilizziamo il costrutto echo:

<?php

echo 674;
echo 56;
echo -83869;
echo 5;
echo -17;

?>

Otteniamo questo risultato:

67456-838695-17

Utilizziamo dei tag <br> per mettere su una nuova linea ogni numero:

<?php

echo 674;
echo "<br>";
echo 56;
echo "<br>";
echo -83869;
echo "<br>";
echo 5;
echo "<br>";
echo -17;

?>

Questa volta sarà tutto più leggibile:

674
56
-83869
5
-17

Possiamo inserire i numeri interi all’interno delle variabili e subito dopo visualizzarli con il costrutto echo:

<?php

// Definiamo dei numeri interi nelle variabili
$int1 = 83;
$int2 = 6749;
$int3 = 2;

$int4 = -6893;
$int5 = -12;
$int6 = -675;

// Visualizziamo ogni numero intero
echo $int1;
echo "<br>";
echo $int2;
echo "<br>";
echo $int3;
echo "<br>";
echo $int4;
echo "<br>";
echo $int5;
echo "<br>";
echo $int6;

?>

Risultato:

83
6749
2
-6893
-12
-675

Da PHP 7.4.0 è possibile utilizzare il simbolo underscore “_” per migliorare la leggibilità dei numeri interi per separare le migliaia. Quindi posizioniamo l’underscore ogni 3 numeri:

<?php

echo 1_000;    // Mille
echo "<br>";
echo 1_200;    // Mille e duecento
echo "<br>";
echo 17_573;
echo "<br>";
echo 1_243_593;
echo "<br>";
echo 77_240;
echo "<br>";
echo 67_492_349;

?>

Risultato:

1000
1200
17573
1243593
77240
67492349

L’interprete di PHP rimuoverà gli underscore restituendo il numero per intero. Quindi gli underscore servono solo a noi programmatori per avere una migliore leggibilità dei numeri.

Come NON definire un numero intero

Nota bene: questi non sono numeri interi ma stringhe di testo:

<?php

// Numeri tra singoli o doppi apici NON sono numeri ma stringhe di testo
$var1 = "65";
$var2 = "-694";
$var3 = "86939";

$var4 = '45';
$var5 = '-4993';
$var6 = '4';

Tra poco vedremo perché e come è possibile convertire delle stringhe in numeri interi.

Analizzare il tipo di dato int in PHP

Con la funzione var_dump() è possibile analizzare il tipo di dato di una variabile e riconoscere quali sono numeri interi:

<?php

// Definiamo delle variabili
$var1 = 567;
$var2 = 45;
$var3 = -684;
$var4 = 5865823;

$var5 = "56";
$var6 = "-3";
$var7 = '-593';
$var8 = '6';

// Analizziamone il contenuto e il tipo di dato con var_dump
var_dump( $var1 );

echo "<br>";

var_dump( $var2 );

echo "<br>";

var_dump( $var3 );

echo "<br>";

var_dump( $var4 );

echo "<br>";

var_dump( $var5 );

echo "<br>";

var_dump( $var6 );

echo "<br>";

var_dump( $var7 );

echo "<br>";

var_dump( $var8 );

echo "<br>";

?>

Ed ecco il risultato:

int(567)
int(45)
int(-684)
int(5865823)
string(2) "56"
string(2) "-3"
string(4) "-593"
string(1) "6"

Come puoi vedere i numeri definiti senza apici o doppi apici sono numeri interi “int(numero)“, i numeri tra apici sono stringhe “string(lunghezza caratteri) contenuto“.

Questo è un metodo molto utile per distinguere i numeri dalle stringhe provenienti da funzioni o risposte dal database.

Conversione stringa in numero intero con intval()

In PHP possiamo convertire una stringa in un numero intero soltanto se la stringa contiene numeri e NON caratteri alfabetici o speciali. Questo possiamo farlo con la funzione intval():

<?php

// Definiamo due stringhe con dei numeri soltanto
$stringaConNumero1 = "674";
$stringaConNumero2 = '83';

// Analizziamone il tipo di dato
var_dump($stringaConNumero1);
echo "<br>";
var_dump($stringaConNumero2);
echo "<br>";

// Riassegniamo alle stesse variabili la stringa convertita in numero
$stringaConNumero1 = intval( $stringaConNumero1 );
$stringaConNumero2 = intval( $stringaConNumero2 );

// Analizziamo di nuovo il tipo di dato
var_dump($stringaConNumero1);
echo "<br>";
var_dump($stringaConNumero2);
echo "<br>";

?>

Risultato della conversione:

string(3) "674"
string(2) "83"
int(674)
int(83)

Inizialmente i due numeri “674” e “83” sono prese in considerazione come delle stringhe di testo.

Successivamente convertiamo queste stringhe in numeri, infatti abbiamo INT al posto di STRING con il numero tra parentesi tonde.

Non possiamo effettuare la conversione da stringa a numero intero se il contenuto comprende caratteri alfanumerici o speciali:

<?php
 
$stringa1 = "abcdefg58&68xkdk";
$stringa2 = "a57h8ch48hC";
$stringa3 = "fh 95 kkd 485 jjd 04";
$stringa4 = "4892 hfh 9395 hdhd 94";

echo intval($stringa1);
echo "<br>";
echo intval($stringa2);
echo "<br>";
echo intval($stringa3);
echo "<br>";
echo intval($stringa4);

?>

Risultato:

0
0
0
4892

Come puoi vedere l’ultimo risultato ha come numero 4892, quindi soltanto i primi numeri della variabile $stringa4.

Infatti la funzione intval() se trova dei numeri all’inizio di una stringa li prenderà in considerazione durante la conversione. Ma dopo il primo carattere si fermerà.

Invece se inizia con caratteri alfabetici o speciali ritornerà come numero 0.

Operazioni aritmetiche

Con i numeri interi è possibile effettuare operazioni aritmetiche con gli operatori aritmetici:

  • + per l’addizione
  • - per la sottrazione
  • / per la divisione
  • * per le moltiplicazioni
  • % per il resto della divisione
  • ** per le potenze
<?php

echo 5 + 5;  // 10

echo "<br>";

echo 5 - 6; // -1

echo "<br>";

echo 25 / 5; // 5

echo "<br>";

echo 10 * 10; // 100

echo "<br>";

echo 4 % 3; // 1 (il resto della divisone)

echo "<br>";

echo 4 % 2; // 0 (il resto della divisione)

echo "<br>";

echo 2**3; // 8 (2 elevato alla 3) [2*2*2]

echo "<br>";

echo 5**2; // 125 (5 elevato alla 2) [5*5]

echo "<br>";

echo 5 + 5 + 5 + 5; // 20

?>

Il risultato è quello dopo i commenti //.

Type juggling

Proviamo a eseguire queste operazioni aritmetiche usando stringhe e numeri interi:

<?php

echo "5" + 5; // 10

echo "<br>";

echo "17" + "5"; // 22

echo "<br>";

echo "63" - "4"; // 59

echo "<br>";

echo "5" * "3"; // 15

echo "<br>";

echo "5" + 5 + "5" + 5 + "7"; // 27

?>

Queste saranno vere e proprie operazioni aritmetiche e il risultato sarà quello dopo il commento //.

Perché accade questo? L’interprete di PHP effettuerà una conversione del tipo di dato in base al contesto. Essendo che le stringhe si rapportano con i suddetti operatori aritmetici PHP provvederà alla conversione di queste in numeri.

Vedremo meglio questo concetto in un articolo dedicato.

Differenza con i numeri decimali (float)

Li vedremo meglio in un articolo separato, ma un numero decimale (detto float) in PHP è composto da:

  • una parte intera prima del punto
  • una parte decimale dopo il punto

Ecco un esempio:

<?php

$numero = 67.30;

var_dump( $numero );    // risultato  float(67.30)

?>

Si usa il punto e non la virgola per delimitare la parte decimale.

La funzione is_int()

La funzione is_int() serve per riconoscere se una variabile ha un tipo di dato int piuttosto che altri.

Passando una variabile come parametro ( is_int( $variabile ) ) la funzione ritornerà un valore booleano TRUE se il contenuto della variabile è un numero, altrimenti ritornerà FALSE.

Possiamo analizzare poi il valore di ritorno da is_int() con la funzione var_dump():

<?php

$var1 = 58;
$var2 = -505;
$var3 = 845829;
$var4 = 576;

$var5 = "Ciao sono Michele";
$var6 = 'Sono uno sviluppatore';
$var7 = "653";
$var8 = "-6464";

var_dump( $var1 );
echo "<br>";
var_dump( $var2 );
echo "<br>";
var_dump( $var3 );
echo "<br>";
var_dump( $var4 );
echo "<br>";
var_dump( $var5 );
echo "<br>";
var_dump( $var6 );
echo "<br>";
var_dump( $var7 );
echo "<br>";
var_dump( $var8 );

?>

Risultato:

bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)

Le prime quattro variabili sono ovviamente numeri interi, quindi nelle prime quattro righe is_int() ritorna un valore booleano TRUE.

Nelle ultime quattro righe abbiamo FALSE.

Applichiamo questo esempio a un blocco if-else:

<?php

$var1 = 54392;

if ( is_int( $var1 ) ) {
    echo "È un numero intero";
} else {
    echo "Non è un numero intero";
}

?>

Risultato:

È un numero intero