Integers (Ακέραιοι)
Ένας integer είναι ένας αριθμός του συνόλου Z = {..., -2, -1, 0, 1, 2, ...}.
Δείτε επίσης: Ακέραιοι αυθαίρετου μεγέθους / GMP, Αριθμού κινητής υποδιαστολής, και Αυθαίρετη ακρίβεια / BCMath
Σύνταξη
Οι ακέραιοι μπορούν να καθοριστούν στο δεκαδικό (με βάση το 10), δεκαεξαδικό (με βάση το 16) ή οκταδικό (με βάση το 8) σύστημα, και προαιρετικά μπορεί να προστεθεί το πρόσημο (- ή +).
Αν χρησιμοποιείτε το οκταδικό σύστημα, πρέπει να γράφετε πριν το αριθμό το 0 (μηδέν), και αν χρησιμοποιείτε το δεκαεξαδικό πρέπει να γράφετε πριν τον αριθμό το 0x.
Example#1 Integer literals (Λεκτικά ακεραίων)
<?php
$a = 1234; # decimal number
$a = -123; # a negative number
$a = 0123; # octal number (equivalent to 83 decimal)
$a = 0x1A; # hexadecimal number (equivalent to 26 decimal)
?>
<?php decimal : [1-9][0-9]* | 0 hexadecimal : 0[xX][0-9a-fA-F]+ octal : 0[0-7]+ integer : [+-]?decimal | [+-]?hexadecimal | [+-]?octal ?>
Υπερχείλιση ακεραίων (Integer overflow)
Αν προσδιορίσετε έναν αριθμός εκτός των ορίων του τύπου integer, θα διερμηνευτεί ως float (κινητής υποδιαστολής). Επίσης, αν κάνετε μια πράξη το αποτέλεσμα της οποίας δίνει αριθμό πέρα από τα όρια του τύπου integer, θα επιστραφεί αριθμός τύπου float (κινητής υποδιαστολής).
<?php
$large_number = 2147483647;
var_dump($large_number);
// output: int(2147483647)
$large_number = 2147483648;
var_dump($large_number);
// output: float(2147483648)
// this goes also for hexadecimal specified integers:
var_dump( 0x80000000 );
// output: float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// output: float(50000000000)
?>
Δυστυχώς, υπήρχε ένα bug στην PHP με αποτέλεσμα αυτό να μην λειτουργεί παντα σωστά όταν υπάρχουν αρνητικοί αριθμοί. Για παράδειγμα: όταν κάνετε -50000 * $million, το αποτέλεσμα θα είναι -429496728. Σε περίπτωση βέβαια που και οι δυο τελεστές είναι θετικοί δεν υπάρχει πρόβλημα.
Αυτό λύθηκε στην PHP 4.1.0.
Δεν υπάρχει τελεστής διαίρεσης στην PHP. Το 1/2 μετατρέπεται στον αριθμό float 0.5. Μπορείτε να μετατρέψετε την τιμή σε ακέραιο να το στρογγυλοποιήσετε προς τα κάτω, ή να χρησιμοποιήσετε τη συνάρτηση round() .
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Μετατρέποντας σε ακέραιο
Για να μετατρέψετε ρητά μια τιμή σε integer, χρησιμοποιήστε είτε το (int) είτε το (integer) για τη μετατροπή (cast). Πάντως, στις περισσότερες περιπτώσεις δεν χρειάζεται να χρησιμοποιήσετε την cast, αφού η τιμή θα μετατραπεί αυτόματα αν ένας τελεστής, μια συνάρτηση ή μια δομή ελέγχου απαιτεί μια παράμετρο τύπου integer . Μπορείτε επίσης να μετατρέψετε μια τιμή σε ακέραιο μέσα στη συνάρτηση intval().
Δείτε επίσης type-juggling.
Από booleans
FALSE θα προκύψει 0 (μηδέν), και από TRUE θα προκύψει 1 (ένα).
Από αριθμούς κινητής υποδιαστολής
Όταν γίνεται μετατροπή από αριθμού κινητής υποδιαστολής σε ακέραιο, ο αριθμός θα στρογγυλευτεί προς το μηδέν.
Αν ο αριθμός κινητής υποδιαστολής είναι εκτός των ορίων του ακεραίου (συνήθως +/- 2.15e+9 = 2^31), το αποτέλεσμα είναι απροσδιόριστο, αφού ο αριθμός κινητής υποδιαστολής δεν έχει αρκετή ακρίβεια για να δώσει ένα ακριβές ακέραιο αποτέλεσμα. Καμιά προειδοποίηση, ούτε κάποια άλλη υπενθύμιση γίνεται σε τέτοιες περιπτώσεις!
Ποτέ μην αλλάζετε τον τύπο μιας παράστασης σε integer, αφού αυτό μπορεί μερικές φορές να οδηγήσει σε μη αναμενόμενα αποτελέσματα.
<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>
Από strings
Από άλλους τύπους
Ο τρόπος με τον οποίο γίνεται η μετατροπή σε ακέραιο δεν είναι καθορισμένος για άλλους τύπους. Προς το παρόν, η μετατροπή γίνεται θεωρώντας ότι η τιμή πρώτα μετατρέπεται σε boolean. Πάντως, μην βασίζεστε σε αυτόν τον τρόπο, αφού μπορεί να αλλάξει χωρίς προειδοποίηση.