ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Η Βίβλος της PHP - Μέρος 3α -
Οι Συναρτήσεις : Εισαγωγή, Ημερομηνίας, Μαθηματικές

 

Εισαγωγή στις Συναρτήσεις της PHP

Οι συναρτήσεις (functions) της PHP, δηλ. αυτές που υπάρχουν ενσωματωμένες μέσα στην PHP αλλά και αυτές που δημιουργούμε μόνοι μας, διευκολύνουν πολύ το γράψιμο του κώδικα καθώς μας δίνουν τη δυνατότητα να επαναχρησιμοποιήσουμε τον κώδικα που έχουν γράψει κάποιοι άλλοι χρήστες και μπορούμε ακόμη να κάνουμε τα δικά μας scripts να έχουν μικρό μέγεθος και να είναι έτσι πιο εύκολα στη διαχείρισή τους.

Καθώς η PHP 5 περιέχει περισσότερες από 2.500 συναρτήσεις, μπορεί να σκεφθούμε ότι είναι μια πολύ εύκολη γλώσσα προγραμματισμού, αλλά η αλήθεια είναι ότι η κάθε συνάρτηση πρέπει να χρησιμοποιείται με διαφορετικό τρόπο και έτσι πρέπει να μαθαίνεται ξεχωριστά. Θα ξεκινήσουμε με τις πιο χρήσιμες και πιο απλές συναρτήσεις που διαθέτει η PHP.

Για να αποφύγουμε να γράφουμε τα ίδια κομμάτια κώδικα κάθε φορά που θέλουμε να κάνουμε την ίδια εργασία, η PHP μάς δίνει τη δυνατότητα να ενσωματώσουμε κάποιον κώδικα σε μια συνάρτηση την οποία θα μπορούμε μετά να καλέσουμε από οπουδήποτε μέσα από ένα script.

Η PHP διαθέτει μερικές εκατοντάδες ενσωματωμένες συναρτήσεις (built-in functions) για να κάνουμε πολλές δουλειές, όπως διάβασμα αρχείων και χειρισμό strings μέχρι και αναζητήσεις σε βάσεις δεδομένων και σύνδεση μ’ έναν IRC server. Αν διαπιστώσουμε ότι δεν υπάρχει κάποια συνάρτηση που την χρειαζόμαστε, μπορούμε να προσθέσουμε τη δική μας σ’ ένα script και αυτές είναι γνωστές ως οι συναρτήσεις του χρήστη (user functions).

Θα δούμε αρχικά το πώς μπορούμε να χρησιμοποιήσουμε τις ενσωματωμένες συναρτήσεις της PHP μέσα από τα δικά μας scripts. Η κλήση μιας συνάρτησης γίνεται πολύ απλά γράφοντας το όνομά της ακολουθούμενο από δύο παρενθέσεις. Πολλές συναρτήσεις δέχονται παραμέτρους (parameters), δηλ. τιμές που χρησιμοποιούνται για να επηρεάσουν την εκτέλεση και φυσικά και το αποτέλεσμα της συνάρτησης.

Επίσης, όλες σχεδόν οι συναρτήσεις έχουν και μια τιμή επιστροφής (return value), που είναι το αποτέλεσμα από την εκτέλεση των εντολών της συνάρτησης και μπορούμε μάλιστα να χρησιμοποιήσουμε την τιμή επιστροφής μιας συνάρτησης ως παράμετρο σ’ άλλες συναρτήσεις, ως εξής : 

func1(func2(func3(), func4()));

Θα πρέπει να έχουμε υπόψη μας ότι με τον όρο παράμετροι εννοούμε τις μεταβλητές που εμφανίζονται στη δήλωση της συνάρτησης και που ορίζουν ποιες τιμές πρέπει να μεταβιβασθούν στη συνάρτηση, ενώ οι πραγματικές παράμετροι που μεταβιβάζονται όταν γίνεται η κλήση μιας συνάρτησης αποκαλούνται ορίσματα (arguments). Βέβαια, ουσιαστική διαφορά δεν υπάρχει ανάμεσα στους δύο αυτούς όρους και πολλοί χρησιμοποιούν τους όρους «παράμετροι» και «ορίσματα» για να αναφέρονται στο ίδιο πράγμα.

Κάτι άλλο που θα πρέπει να έχουμε υπόψη μας είναι ότι ενώ μερικές παράμετροι είναι υποχρεωτικές, δηλ. θα πρέπει να καταχωρήσουμε κάποια τιμή γι’ αυτές, κάποιες άλλες είναι προαιρετικές, δηλ. μπορούμε να μην γράψουμε κάτι στη θέση τους. Στην περίπτωση αυτή, η PHP θα χρησιμοποιήσει μια δική της προκαθορισμένη τιμή (default value). Όταν μεταβιβάζουμε μια παράμετρο σε μια συνάρτηση, η PHP στην πραγματικότητα χρησιμοποιεί ένα αντίγραφο της τιμής της και αυτό σημαίνει ότι μπορούμε να τροποποιήσουμε τις μεταβλητές μέσα σε μια συνάρτηση αλλά δεν θα αλλάξουν και οι αντίστοιχες τιμές τους εκτός της συνάρτησης.

Για να αλλάξουμε αυτή την κατάσταση, μπορούμε να επιλέξουμε να μεταβιβάσουμε μια μεταβλητή με αναφορά (by reference), οπότε η PHP μεταβιβάζει την πραγματική μεταβλητή μέσα στη συνάρτηση και αυτό σημαίνει ότι όποιες αλλαγές κάνουμε στην τιμή της μεταβλητής θα επηρεάσουν και την αρχική τιμή της. Αυτό θα φανεί καλύτερα στο παρακάτω script

<?php

somefunc($a);

somefunc($a, $b);

somefunc($a, &$b);

somefunc(&$a, &$b);

?>

Η πρώτη γραμμή του κώδικα καλεί τη συνάρτηση somefunc() και της μεταβιβάζει ένα αντίγραφο της μεταβλητής $a, η δεύτερη γραμμή του κώδικα μεταβιβάζει αντίγραφα των $a και $b, η τρίτη μεταβιβάζει ένα αντίγραφο της $a και την αρχική τιμή της $b και τέλος, η τελευταία γραμμή κώδικα μεταβιβάζει τις αρχικές τιμές και της $a και της $b.

Η μεταβίβαση με αναφορά (passing by reference), όπως συμβαίνει με τη μεταβλητή $b στην 3η γραμμή και τις μεταβλητές $a και $b στην 4η γραμμή κώδικα, σημαίνει ότι αυτές οι μεταβλητές μπορεί να αλλάξουν μέσα στη συνάρτηση, που είναι κι ένας τρόπος για να επιστρέφουν τιμές οι συναρτήσεις. 

 

Τα Πρωτότυπα των Συναρτήσεων

Ο στάνταρτ τρόπος για να περιγράψουμε τις παραμέτρους που δέχεται και την τιμή που επιστρέφει μια συνάρτηση είναι με το πρωτότυπο μιας συνάρτησης (function prototype). Η κατανόησή του είναι πολύ σημαντική για τη συνέχεια. Θα δούμε αρχικά το πρωτότυπο της συνάρτησης strtoupper() :

string strtoupper ( string string)

Αυτό που καταλαβαίνουμε με μια πρώτη ματιά είναι ότι η συνάρτηση δέχεται ένα string ως παράμετρο και επιστρέφει επίσης ένα string. Μπορεί να μας μπερδεύει η έκφραση "string string", που σημαίνει ότι ο τύπος δεδομένων της παραμέτρου είναι string αλλά και το όνομα που δίνουμε στην παράμετρο είναι επίσης string.

Η συνάρτηση επιστρέφει μια τιμή string και βλέπουμε ότι ο τύπος δεδομένων της τιμής επιστροφής αναγράφεται πριν από το όνομα της συνάρτησης, που αποτελεί μια ακόμα πρακτική της C. Για τις παραμέτρους που μεταβιβάζονται με αναφορά (by reference), χρησιμοποιούμε ως πρόθεμα το σύμβολο &. Θα δούμε τώρα το πρωτότυπο της συνάρτησης sha1() :

string sha1 ( string source [, bool raw_output])

Όπως μπορούμε να δούμε, η συνάρτηση sha1() επιστρέφει μια τιμή string, δέχεται ένα string ως την πρώτη παράμετρό της και μια τιμή boolean ως τη δεύτερη παράμετρό της. Όμως, η δεύτερη παράμετρος βρίσκεται ανάμεσα σε αγκύλες, που σημαίνει ότι είναι προαιρετική. Στα πρωτότυπα υπάρχουν δύο ειδικοί τύποι δεδομένων, οι number και mixed. Το number μπορεί να είναι ένας αριθμός κινητής υποδιαστολής (floating-point) ή ένας ακέραιος αριθμός (integer) και το mixed σημαίνει ότι η συνάρτηση δέχεται ή επιστρέφει δύο ή περισσότερους τύπους δεδομένων.

Για παράδειγμα, ο ορισμός της συνάρτησης pow() είναι ο εξής :

number pow ( number base, number exp)

Αυτό σημαίνει ότι δέχεται οποιουσδήποτε αριθμούς ως παραμέτρους και μπορεί να επιστρέψει έναν οποιονδήποτε αριθμό.

Ο ορισμός της συνάρτησης serialize() είναι ο εξής : 

string serialize ( mixed value)

Η συνάρτηση serialize() εργάζεται και με αντικείμενα (objects) και με τάξεις (classes), οπότε η παράμετρός της είναι του τύπου mixed. Υπάρχει και ο γνωστός τύπος δεδομένων void, που σημαίνει ότι η συνάρτηση δεν επιστρέφει κάποια τιμή ή ότι δεν δέχεται κάποια παράμετρο ως είσοδο. Θα δούμε και τον συμβολισμό "...", που σημαίνει ότι η συνάρτηση δέχεται έναν μεταβλητό αριθμό παραμέτρων. Για παράδειγμα, το πρωτότυπο της συνάρτησης isset() είναι το εξής : 

bool isset ( mixed var [, mixed var [, mixed ...]])

Η παραπάνω συνάρτηση δέχεται μία τουλάχιστον παράμετρο ως είσοδο, αλλά μπορεί να δεχθεί και περισσότερες καθώς υπάρχει ο συμβολισμός "...".

 

Συναρτήσεις για τον Έλεγχο Μεταβλητών

bool isset ( mixed var [, mixed var [, mixed ...]])

void unset ( mixed var [, mixed var [, mixed ...]])

bool empty ( mixed var)

Υπάρχουν τρεις πολύ βασικές συναρτήσεις με τις οποίες μπορούμε να ελέγχουμε τις μεταβλητές, οι isset(), empty() και unset(). Η συνάρτηση isset() επιστρέφει την τιμή true αν η μεταβλητή που της μεταβιβάζεται ως παράμετρος έχει ήδη ορισθεί μέσα στο script, ενώ η συνάρτηση empty(), η οποία δέχεται μία μόνο παράμετρο, επιστρέφει την τιμή true αν η μεταβλητή έχει την τιμή false.

Για να ελέγξουμε αν μια μεταβλητή δεν έχει ορισθεί, μπορούμε να χρησιμοποιήσουμε τον τελεστή άρνησης ! και να δώσουμε την εντολή "if (!isset($a))". Η συνάρτηση unset() διαγράφει πλήρως μια ήδη υπάρχουσα μεταβλητή, που σημαίνει ότι αν μετά χρησιμοποιήσουμε τη συνάρτηση isset(), αυτή θα επιστρέψει την τιμή false.

 

Συναρτήσεις για τον Έλεγχο της Εκτέλεσης του Script

void exit ( [mixed status])

mixed eval ( [string code_string])

void die ( [mixed status])

Η συνάρτηση exit() λαμβάνει μία μόνο προαιρετική παράμετρο και σταματάει αμέσως την εκτέλεση του script. Αν υπάρχει παράμετρος, θα εκτελεστεί ο κώδικας που αυτή περιέχει ή αν είναι string θα εμφανισθεί το περιεχόμενό του. Η συνάρτηση die() είναι σχεδόν ίδια με τη συνάρτηση exit(), ενώ η συνάρτηση eval() λαμβάνει ένα string ως παράμετρο το οποίο και εκτελεί σαν να ήταν PHP κώδικας. Ακολουθούν παραδείγματα με τις συναρτήσεις exit() και eval() :

<?php

$str = "exit()";

eval($str);

?>

Το παραπάνω script εκχωρεί το string "exit()" στη μεταβλητή $str και μετά μεταβιβάζει το $str στη συνάρτηση eval(), η οποία θα εκτελέσει το string σαν να ήταν PHP κώδικας και έτσι το τελικό αποτέλεσμα είναι ότι η PHP εκτελεί τη συνάρτηση exit() μέσω της eval() και σταματάει την εκτέλεση του script. Με τη συνάρτηση exit() μπορούμε να τερματίσουμε την εκτέλεση ενός script, όπως για παράδειγμα :

if ($a != $blahblah) {

print "Απαγορεύεται η πρόσβαση";

exit;

}

Η συνάρτηση die() χρησιμοποιείται συνήθως ως εξής :

do_some_func() OR die("Η do_some_func() επέστρεψε false!");

Σύμφωνα με τον παραπάνω κώδικα, θα κληθεί η συνάρτηση do_some_ func() και αν επιστρέψει την τιμή false, θα κληθεί η συνάρτηση die() για να τερματίσει το script. Αυτό αποτελεί έναν γρήγορο και εύκολο τρόπο για να είμαστε σίγουροι ότι κάποιες συναρτήσεις έχουν εκτελεστεί με επιτυχία πριν συνεχίσουμε με τον υπόλοιπο κώδικα του script.

Όπως ήδη γνωρίζουμε, η PHP θα εκτελέσει τη δεύτερη συνάρτηση μόνο αν η πρώτη συνάρτηση επιστρέψει την τιμή false. Εκείνο που πρέπει να έχουμε υπόψη μας είναι ότι ο τελεστής ||, δηλ. το ισοδύναμο του τελεστή OR, έχει υψηλότερη προτεραιότητα από τον τελεστή OR αλλά υψηλότερη προτεραιότητα και από τον τελεστή =. Αυτό θα το καταλάβουμε καλύτερα με το επόμενο παράδειγμα :

$fp = fopen("somefile", "r") || die("Το αρχείο δεν άνοιξε!");

Από μια πρώτη ματιά φαίνεται ίδιο με το προηγούμενο παράδειγμα της συνάρτησης die(), δηλ. η PHP θα προσπαθήσει να φορτώσει το αρχείο "somefile" και θα δημιουργήσει έναν δείκτη αρχείου (file pointer) στη μεταβλητή $fp και αν αυτό αποτύχει, θα τερματίσει (exit) την εκτέλεση του script με το μήνυμα "Το αρχείο δεν άνοιξε!".

Όμως, δεν συμβαίνει κάτι τέτοιο και αυτό επειδή ο τελεστής || έχει υψηλότερη προτεραιότητα από τον τελεστή =, είναι αυτός που υπολογίζεται πρώτος. Έτσι, η PHP θα προσπαθήσει πρώτα να φορτώσει το αρχείο somefile και αν επιτύχει, η συνάρτηση fopen() θα επιστρέψει ένα resource που θα είναι true. Η συνάρτηση die() πάντα αποτιμάται ως true.

Όμως, επειδή η PHP θα βραχυκυκλώσει τον τελεστή ||, όταν η συνάρτηση fopen() επιτύχει, η συνάρτηση die() δεν θα κληθεί και ο τελεστής || θα επιστρέψει την τιμή 1 (true) επειδή ο τελεστέος που βρίσκεται στα αριστερά του (κλήση στη συνάρτηση fopen()) επέστρεψε την τιμή true. Στην ουσία, η PHP διαβάζει την παραπάνω γραμμή κώδικα ως εξής :

$fp = (fopen("somefile", "r") || die("Το αρχείο δεν άνοιξε!"));

Η τιμή 1 θα εκχωρηθεί στη μεταβλητή $fp. Δεν θα θέλαμε, όμως, κάτι τέτοιο και έτσι θα πρέπει να χρησιμοποιήσουμε τον τελεστή OR. Καθώς ο τελεστής OR έχει χαμηλότερη προτεραιότητα από τον τελεστή =, η PHP θα διαβάσει τη γραμμή του κώδικα ως εξής :

($fp = fopen("somefile", "r")) or die("Το αρχείο δεν άνοιξε!");

Αυτό σημαίνει ότι καλείται η συνάρτηση fopen() και η τιμή της εκχωρείται στη μεταβλητή $fp, η οποία μετά στέλνεται στον τελεστή σύγκρισης. Έχουμε ανάγκη και από τους δύο τελεστές || και OR, αλλά θα πρέπει να επιλέξουμε αυτόν που χρειαζόμαστε κάθε φορά.

 

Οι Συναρτήσεις Ημερομηνίας και Ώρας

Η PHP παριστάνει τον χρόνο ως τον αριθμό των δευτερολέπτων που έχουν παρέλθει από την 1η Ιανουαρίου του 1970 και ώρα 00:00:00 GMT, μια ημερομηνία που είναι γνωστή ως η αρχή της εποχής του Unix (Unix epoch).

Αυτός ο τρόπος αποθήκευσης ημερομηνιών μπορεί να μας φαίνεται περίεργος αλλά είναι εξαιρετικά βολικός καθώς μπορούμε να αποθηκεύσουμε μια οποιαδήποτε ημερομηνία με τη μορφή ενός ακεραίου αριθμού και μετά να μετατρέψουμε αυτόν τον αριθμό σε μια μορφή ημερομηνίας που να είναι κατανοητή από τον άνθρωπο.

 

Διάβασμα της Τρέχουσας Ώρας

int time ( )

mixed microtime ( [bool get_as_float])

Η PHP διαθέτει μια βασική συνάρτηση για να διαβάσουμε την τρέχουσα ώρα στη μορφή epoch, την time(). Η συνάρτηση time() δεν δέχεται παραμέτρους και επιστρέφει την τρέχουσα ώρα, που είναι γνωστή και ως σφραγίδα χρόνου (timestamp). Ακολουθεί ένα παράδειγμα :

<?php

print time()."<br>";

$a = time();

print $a;

?>

Το αποτέλεσμα από την εκτέλεση του παραπάνω script θα είναι το εξής :

1196975018
1196975018

Όπως βλέπουμε και από το παραπάνω παράδειγμα, μπορούμε είτε να εκτυπώσουμε απευθείας την τιμή επιστροφής της συνάρτησης time() ή μπορούμε να την αποθηκεύσουμε σε μια μεταβλητή και μετά να εκτυπώσουμε την τιμή της μεταβλητής. Το αποτέλεσμα είναι το ίδιο.

Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση microtime() για πιο ακριβείς τιμές ώρας. Όταν καλείται αυτή η συνάρτηση χωρίς κάποια παράμετρο, επιστρέφει την τρέχουσα ώρα του συστήματος σε δευτερόλεπτα (seconds) και εκατομμυριοστά του δευτερολέπτου (microseconds), με πρώτα τα εκατομμυριοστά του δευτερολέπτου. Για παράδειγμα : 

0.82112000 1174676574

Αν δώσουμε την τιμή true ως παράμετρο στη συνάρτηση microtime(), η PHP θα επιστρέψει την ώρα στη μορφή seconds.microseconds, ως εξής :

1174676587.5996

Με τη ρύθμιση precision στο αρχείο php.ini μπορούμε να ορίσουμε τον αριθμό των σημαντικών ψηφίων (significant digits) που θέλουμε να εμφανίζονται σ’ έναν αριθμό κινητής υποδιαστολής (floating-point number).

 

Δημιουργία Ημερομηνίας από ένα String

int strtotime ( string time [, int now])

Η μετατροπή μιας ημερομηνίας από την καταχώρηση ενός χρήστη στη μορφή Unix timestamp μπορεί να είναι επικίνδυνη καθώς κάποιοι χρήστες καταχωρούν τις ημερομηνίες με τη μορφή ηη/μμ/εε, άλλοι με τη μορφή εε-μμ-ηη, άλλοι με τη μορφή ηη-μμ-εεεε κοκ. Η συνάρτηση που παρέχει η PHP για τη μετατροπή ενός string σε μορφή timestamp, η strtotime(), λαμβάνει δύο παραμέτρους : το string της ώρας και μια δεύτερη προαιρετική παράμετρο που μπορεί να είναι ένα σχετικό timestamp. Η πρώτη παράμετρος είναι σημαντική και θα την δούμε αμέσως παρακάτω :

<?php

print strtotime("22nd December 1979");

print strtotime("22 Dec. 1979 17:30");

print strtotime("1979/12/22");

?>

Βλέπουμε ότι χρησιμοποιήσαμε τρεις τρόπους για να παραστήσουμε την ίδια ημερομηνία, όπου στον δεύτερο τρόπο συμπεριλάβαμε και την ώρα. Αν τρέξουμε το παραπάνω script, θα δούμε ότι η PHP εμφανίζει έναν ακέραιο για την κάθε εντολή, όπου ο πρώτος και ο τρίτος αριθμός είναι ίδιοι και ο δεύτερος είναι λίγο διαφορετικός.

Αυτοί οι αριθμοί είναι οι λεγόμενες σφραγίδες χρόνου του Unix (Unix timestamps) που αντιστοιχούν στις ημερομηνίες που μεταβιβάσαμε στη συνάρτηση strtotime(), η οποία έκανε και τη μετατροπή. Θα πρέπει να έχουμε υπόψη μας ότι η συνάρτηση strtotime() χρησιμοποιεί το αμερικάνικο στυλ για τις ημερομηνίες, δηλ. βάζει πρώτα τον μήνα, όπως στην ημερομηνία 10/11/2007, όπου θεωρεί ότι είναι 11 Οκτωβρίου και όχι 10 Νοεμβρίου.

Αν η PHP δεν μπορέσει να μετατρέψει το string σε μορφή timestamp, θα επιστρέψει την τιμή -1. Αυτό μπορούμε να το χρησιμοποιήσουμε για να ελέγχουμε αν έγινε σωστά η μετατροπή μιας ημερομηνίας, ως εξής :

<?php

$mydate = strtotime("Christmas 2006");

if ($mydate == -1) {

print "Η μετατροπή της ημερομηνίας απέτυχε!";

} else {

print "Η μετατροπή της ημερομηνίας έγινε!";

}

          ?>

Όπως είδαμε νωρίτερα, η συνάρτηση strtotime() διαθέτει και μια δεύτερη προαιρετική παράμετρο που την χρησιμοποιεί ως βάση για τον υπολογισμό σχετικών ημερομηνιών. Ο λόγος γι’ αυτό είναι ότι η πρώτη παράμετρος μπορεί να περιέχει σχετικές τιμές, όπως "Next Sunday", "2 days" ή "1 year ago" κοκ. Σ’ αυτήν την περίπτωση, η PHP πρέπει να γνωρίζει με ποια βάση θα υπολογίσει αυτές τις σχετικές τιμές. Ακολουθούν μερικά παραδείγματα :

<?php

print strtotime("Next Sunday");

print strtotime("2 days", time() - (86400 * 2));

print strtotime("1 year ago", 123456789);

?>

Η πρώτη γραμμή θα εμφανίσει το timestamp για την επόμενη Κυριακή. Η δεύτερη γραμμή θα επιστρέψει την τρέχουσα ώρα, δηλ. δύο ημέρες από τώρα μείον δύο ημέρες (86400 = 24 Χ 60 Χ 60). Η τελευταία εντολή αφαιρεί ένα έτος από ένα δεδομένο timestamp.

 

Μετατροπή Ημερομηνιών σε String

string date ( string format [, int timestamp])

Η PHP διαθέτει πάρα πολλές επιλογές για να μετατρέψουμε timestamps σε strings με τη συνάρτηση date(). Η συνάρτηση date() δέχεται δύο παραμέτρους, όπου η δεύτερη είναι προαιρετική. Η πρώτη παράμετρος είναι ένα ειδικό string που περιέχει κωδικούς μορφοποίησης για το πώς θέλουμε να εμφανισθεί η ημερομηνία. Η δεύτερη παράμετρος είναι το timestamp που θέλουμε να μετατρέψουμε, όπου αν δεν δώσουμε κάποια τιμή, η PHP θα θεωρήσει ότι θέλουμε να μετατρέψουμε το τρέχον timestamp.

Η πρώτη παράμετρος είναι το κλειδί και είναι ένα string από γράμματα από μια προκαθορισμένη λίστα 31 δυνατών τιμών. Αν χρησιμοποιήσουμε άλλους χαρακτήρες στο string, αυτοί θα αντιγραφούν απευθείας μέσα στη μορφοποιημένη ημερομηνία. Αν θελήσουμε να συμπεριλάβουμε κάποιο κείμενο μέσα στη μορφοποιημένη ημερομηνία αλλά να μην εκληφθεί ως παράμετρος, θα πρέπει να χρησιμοποιήσουμε τον χαρακτήρα \ (backslash).

Ακολουθεί η ολοκληρωμένη λίστα των χαρακτήρων που χρησιμοποιούνται για τη μορφοποίηση των ημερομηνιών και δεν θα πρέπει να ξεχνάμε ότι είναι case sensitive, δηλ. ξεχωρίζουν τα πεζά από τα κεφαλαία γράμματα.

Χαρακτήρας

Μορφοποίησης

Περιγραφή

Παράδειγμα

a

Το am/pm με πεζά γράμματα

am ή pm

A

Το am/pm με κεφαλαία γράμματα

AM ή PM

B

Swatch Internet Time

000 έως 999

c

Η ημερομηνία, η ώρα και η ζώνη της ώρας (time zone) σύμφωνα με το ISO 8601

2007-12-01T09:26:55+01:00

d

Ο αριθμός του μήνα με 2 ψηφία

01 έως 31

D

Το όνομα της ημέρας με 3 γράμματα

Mon, Thu, Sat

F

Το πλήρες όνομα του μήνα

January, August

g

Η ώρα σε 12ωρη μορφή, χωρίς μηδενικά μπροστά

1 έως 12

G

Η ώρα σε 24ωρη μορφή, χωρίς μηδενικά μπροστά

0 έως 23

h

Η ώρα σε 12ωρη μορφή, με μηδενικά μπροστά

01 έως 12

H

Η ώρα σε 24ωρη μορφή, με  μηδενικά μπροστά

00 έως 23

i

Τα λεπτά της ώρας με μηδενικά μπροστά

00 έως 59

I

Αν είναι ενεργή η θερινή ώρα

1 αν ναι, 0 αν όχι

j

Η ημέρα του μήνα, χωρίς μηδενικά μπροστά

1 έως 31

l

Το πλήρες όνομα της ημέρας

Monday, Saturday

L

Αν πρόκειται για δίσεκτο έτος

1 αν ναι, 0 αν όχι

m

Ο αριθμός του μήνα, με μηδενικά μπροστά

01 έως 12

M

Το σύντομο όνομα του μήνα

Jan, Aug

n

Ο αριθμός του μήνα, χωρίς μηδενικά μπροστά

1 έως 12

O

Η διαφορά από την ώρα GMT

200

r

Η μορφή της ημερομηνίας σύμφωνα με το RFC-822

Sat, 22 Dec 1979 17:30 +0000

s

Τα δευτερόλεπτα της ώρας με μηδενικά μπροστά

00 έως 59

S

Το αγγλικό αριθμητικό επίθεμα για την ημέρα του μήνα

st, nd, rd ή th

t

Ο αριθμός των ημερών που έχει ο μήνας

28 έως 31

T

Η ζώνη της ώρας (time zone) για τον server

GMT, CET, EST

U

Η σφραγίδα χρόνου (Unix Timestamp)

1056150334

w

Ο αριθμός της ημέρας της εβδομάδας

0 (Sunday), 6 (Saturday)

W

Ο αριθμός της εβδομάδας του έτους σύμφωνα με το ISO-8601

30 (30η εβδομάδα του έτους)

y

Το έτος με δύο ψηφία

93, 07

Y

Το έτος με τέσσερα ψηφία

1993, 2007

z

Η ημέρα του έτους

0 to 366

Z

Η διαφορά της ζώνης ώρας (time zone offset) σε δευτερόλεπτα

-43200 to 43200

Όπως μπορούμε να δούμε, υπάρχουν πολλές επιλογές διαθέσιμες όταν κάνουμε μετατροπή από ένα timestamp σε ημερομηνία. Ακολουθούν μερικά παραδείγματα με χαρακτήρες μορφοποίησης ημερομηνιών :

<?php

print date("H:i") . "\n";

print "Χθες ήταν : " . date("l", time() - 86400) . "\n";

print "Το έτος είναι : " . date("Y") . "\n";

print date("jS of F Y") . "\n";

print "Τα γενέθλιά μου είναι : "  . date("l", strtotime("01 Dec 2007")) . " φέτος.\n";

print date("\M\y b\i\\r\\t\h\d\a\y \i\s o\\n \a l \\t\h\i\s \ye\a\\r. ", strtotime("01 Dec 2007")) . "\n";

?>

Το αποτέλεσμα από την εκτέλεση του παραπάνω script θα είναι το εξής :

01:31

Χθες ήταν : Saturday

Το έτος είναι : 2007

2nd of December 2007

Τα γενέθλιά μου είναι : Saturday φέτος.

My birthday is on a Saturday this year.

Η πρώτη γραμμή είναι η πιο βασική και απλά εμφανίζει την τρέχουσα ώρα σε 24ωρη μορφή. Η δεύτερη γραμμή είναι λίγο πιο πολύπλοκη καθώς αναμειγνύει την έξοδο της συνάρτησης date() μ’ ένα κομμάτι κειμένου ώστε να είναι πιο φυσικό το αποτέλεσμα. Κάτι ανάλογο έχουμε και στην τρίτη γραμμή.

Η τέταρτη γραμμή εμφανίζει την ημερομηνία στη μορφή "2nd of December 2007", όπου γράψαμε εμείς τη λέξη "of". Η PHP δεν μπερδεύτηκε και αυτό γιατί το μικρό γράμμα o και το μικρό γράμμα f δεν χρησιμοποιούνται στη μορφοποίηση ημερομηνιών της συνάρτησης date() και έτσι εμφανίζονται στην έξοδο όπως ακριβώς είναι. Στην πέμπτη γραμμή έχουμε ενώσει την έξοδο της συνάρτησης date() με δύο άλλα strings. Μπορούμε να γράψουμε τα strings και μέσα στη συνάρτηση date(), όπως φαίνεται στην έκτη γραμμή, αλλά αυτό είναι πολύ πιο πολύπλοκο.

Στην έκτη γραμμή βλέπουμε ότι συμπεριλάβαμε κείμενο μέσα στη συνάρτηση date() αλλά αναγκαστήκαμε να χρησιμοποιήσουμε τον χαρακτήρα \ για να μην μπερδευτεί η PHP και εκλάβει τα γράμματα ως εντολές μορφοποίησης, όπως \M\y κλπ. Τα μικρά γράμματα b, o και e δεν χρησιμοποιούνται στις εντολές μορφοποίησης και έτσι δεν χρειάζεται να χρησιμοποιήσουμε τον χαρακτήρα \.

Τα μικρά γράμματα r, t και n έχουν ειδική χρήση ως χαρακτήρες διαφυγής (carriage return, tab και new line αντίστοιχα) και έτσι αναγκαστήκαμε να χρησιμοποιήσουμε δύο χαρακτήρες \\. Το ένα backslash εμποδίζει την PHP από το να τα διαβάσει ως χαρακτήρες μορφοποίησης ημερομηνιών και το άλλο εμποδίζει την PHP από το να τα εκλάβει ως χαρακτήρες διαφυγής.

 

Δημιουργία Ημερομηνιών από Συστατικά

int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

Αποτελεί κοινή τακτική να αποθηκεύουμε το έτος, τον μήνα και την ημερομηνία σε ξεχωριστές μεταβλητές ώστε να είναι πιο εύκολη η σύγκριση και υπάρχει μια ειδική συνάρτηση για να δημιουργήσουμε ένα timestamp στο Unix από τα συστατικά μιας ημερομηνίας, η mktime(). Η σειρά αναγραφής των συστατικών της ημερομηνίας ως ορίσματα μέσα στη συνάρτηση είναι η εξής : hour, minute, second, month, day, year, Is_Daylight_Savings_Time. Η ώρα (hour) θα πρέπει να είναι γραμμένη σε 24ωρη μορφή.

Έτσι, για να μεταβιβάσουμε την ώρα 10:30pm της 3ης Ιουνίου του 2007, θα πρέπει να χρησιμοποιήσουμε τη συνάρτηση mktime() ως εξής :

$unixtime = mktime(22, 30, 0, 6, 3, 2007, -1);

Με την τελευταία παράμετρο, που εδώ είναι το -1, λέμε στην PHP αν θα είναι ενεργή η θερινή ώρα (DST, Daylight Savings Time). Η τιμή 1 κάνει τη θερινή ώρα να είναι ενεργή, η τιμή 0 την κάνει ανενεργή και η τιμή -1 αφήνει την PHP να αποφασίσει μόνη της.

Με τη συνάρτηση mktime() μπορούμε να κάνουμε και αριθμητικές πράξεις με ημερομηνίες, όπως για παράδειγμα αν προσθέσουμε έναν μεγάλο αριθμό στην τιμή του μήνα, η PHP θα δώσει την κατάλληλη τιμή πρώτα στο έτος και μετά θα υπολογίσει τον μήνα. Παρόμοια, αν προσθέσουμε τον αριθμό 9990 στην τιμή της ώρας, η PHP θα πάει μπροστά 416 ημέρες.

Θα πρέπει να έχουμε υπόψη μας ότι στην PHP είναι επικίνδυνο να βάζουμε μηδενικά μπροστά από τις τιμές που είναι μικρότερες από το 10 (leading zero) και αυτό γιατί οι αριθμοί αυτοί εκλαμβάνονται από την PHP ως οκταδικοί (octal numbers).

 

Οι Μαθηματικές Συναρτήσεις

Η PHP διαθέτει πολλές μαθηματικές συναρτήσεις καθώς και αρκετές σταθερές (constants) για τους δημοφιλείς αριθμούς ώστε να μην είμαστε αναγκασμένοι να τους υπολογίζουμε εμείς. Όλες σχεδόν οι μαθηματικές συναρτήσεις μπορούν να ομαδοποιηθούν σε τρεις περιοχές : στρογγυλοποίησης (rounding), δημιουργίας τυχαίων αριθμών (randomisation) και μετατροπής (conversion), όπου και ανήκουν οι περισσότερες.

 

Στρογγυλοποίηση Αριθμών

float ceil ( float value)

float floor ( float value)

float round ( float value [, int precision])

Επειδή συνήθως θέλουμε λιγότερη ακρίβεια απ’ αυτήν που μας δίνει η PHP, μπορούμε να χρησιμοποιήσουμε τις εξής συναρτήσεις στρογγυλοποίησης : ceil(), floor() και round(). Η ceil() και η floor() λαμβάνουν μία μόνο παράμετρο, τον αριθμό που θέλουμε να στρογγυλοποιήσουμε. Η συνάρτηση ceil() τον στρογγυλοποιεί στον πλησιέστερο ακέραιο που είναι μεγαλύτερος από την τιμή του αριθμού, ενώ η συνάρτηση floor() τον στρογγυλοποιεί στον πλησιέστερο ακέραιο που είναι μικρότερος από την τιμή του αριθμού.

Ακολουθεί ένα παράδειγμα : 

<?php

$someval = 4.9;

$ceiled = ceil($someval);

$floored = floor($someval);

?>

Μετά από την εκτέλεση του παραπάνω κώδικα, η μεταβλητή $ceiled θα είναι ίση με 5 και η μεταβλητή $floored θα είναι ίση με 4. Η συνάρτηση round() λαμβάνει δύο παραμέτρους, τον αριθμό που θέλουμε να στρογγυλοποιήσουμε και το πλήθος των δεκαδικών ψηφίων που θέλουμε να υπάρχουν στον καινούργιο αριθμό.

Ακολουθεί ένα παράδειγμα : 

<?php

$a = round(4.9);                   // 5

$b = round(4.5);                   // 5

$c = round(4.4999);             // 4

$d = round(4.123456, 3);    // 4.123

$e = round(4.12345, 4);      // 4.1235

$f = round(1000 / 160);       // 6

?> 

Όπως μπορούμε να δούμε, το 4.5 στρογγυλοποιείται προς τα πάνω στο 5, ενώ το 4.4999 στρογγυλοποιείται προς τα κάτω στο 4. Στην τέταρτη γραμμή βλέπουμε ότι χρησιμοποιείται για πρώτη φορά και η δεύτερη παράμετρος, με την οποία καθορίζουμε σε πόσα δεκαδικά ψηφία θέλουμε να γίνει η στρογγυλοποίηση. Στην πέμπτη γραμμή έχουμε το αποτέλεσμα 4.1235 στην στρογγυλοποίηση με τέσσερα δεκαδικά ψηφία και αυτό γιατί η PHP κοιτάει το επόμενο ψηφίο για να αποφασίσει αν θα αλλάξει την τιμή του τελευταίου ψηφίου.

Αυτό σημαίνει, ότι αν ο αριθμός ήταν ο 4.12344, η στρογγυλοποίηση με τέσσερα δεκαδικά ψηφία θα έδινε τον αριθμό 4.1234, αλλά στην προηγούμενη περίπτωση επειδή το πέμπτο ψηφίο είναι το 5, το οποίο στρογγυλοποιείται πάντα προς τα πάνω, έχουμε το αποτέλεσμα 4.1235. Στο τελευταίο παράδειγμα, το $f, είναι μια συχνή κατάσταση που συναντάμε με τη συνάρτηση round(). Για παράδειγμα, ας υποθέσουμε ότι οργανώνουμε ένα ταξίδι και έχουμε να μεταφέρουμε 1.000 άτομα. Θα πρέπει να υπολογίσουμε πόσα λεωφορεία θα χρειασθεί να νοικιάσουμε, έτσι διαιρούμε το 1.000 με το 160, που είναι η χωρητικότητα του κάθε λεωφορείου, και μετά στρογγυλοποιούμε το αποτέλεσμα και βλέπουμε ότι προκύπτει το 6.

Το πρόβλημα είναι ότι το πραγματικό αποτέλεσμα είναι της διαίρεσης 1000/160 είναι το 6,25, δηλ. χρειαζόμαστε 6 και κάτι λεωφορεία για να μεταφέρουμε τα 1.000 άτομα, δηλ. στην πραγματικότητα χρειαζόμαστε 7 λεωφορεία. Για να επιλύσουμε προβλήματα όπως το προηγούμενο, θα πρέπει να χρησιμοποιούμε τη συνάρτηση ceil(). Και οι τρεις συναρτήσεις στρογγυλοποίησης είναι χρήσιμες για τη δουλειά που προορίζονται, έτσι θα πρέπει να τις γνωρίζουμε και να τις χρησιμοποιούμε όλες.

 

Δημιουργία Τυχαίων Αριθμών

int rand ( [int min, int max])

int mt_rand ( [int min, int max])

int getrandmax ( )

int mt_getrandmax ( )

void srand ( [int seed])

void mt_srand ( [int seed])

Υπάρχουν περιπτώσεις που χρειαζόμαστε τυχαίους αριθμούς στον κώδικά μας, όπως για να δίνουμε στους επισκέπτες του Web site έναν διαφορετικό χαιρετισμό κάθε φορά που επισκέπτονται την ιστοσελίδα μας ή μπορεί να θέλουμε να δημιουργήσουμε ένα παιχνίδι με τυχαίους αριθμούς (κλήρωση). Η δημιουργία τυχαίων αριθμών (randomisation) είναι μια απλή και χρήσιμη διαδικασία και υπάρχουν δύο συναρτήσεις γι’ αυτόν τον σκοπό, η rand() και η mt_rand().

Και οι δύο αυτές συναρτήσεις κάνουν την ίδια δουλειά και δέχονται τις ίδιες παραμέτρους, αλλά η μεν rand() είναι μια βασική συνάρτηση δημιουργίας τυχαίων αριθμών που είναι πολύ γρήγορη αλλά όχι και πολύ τυχαία, δηλ. οι αριθμοί που δημιουργεί είναι λίγο προβλέψιμοι. Η συνάρτηση mt_rand() από την άλλη πλευρά είναι πιο περίπλοκη, όπου τα γράμματα mt σημαίνουν Mersenne Twister, δηλ. το όνομα του αλγορίθμου παραγωγής τυχαίων αριθμών που χρησιμοποιεί. Η συνάρτηση αυτή επιστρέφει καθαρά τυχαίους αριθμούς αλλά είναι πιο αργή.

Και οι δύο συναρτήσεις χρησιμοποιούν δύο προαιρετικές παραμέτρους (αριθμούς), που είναι ο ελάχιστος και ο μέγιστος αριθμός που μπορεί να επιστραφεί. Μπορούμε είτε να μην δώσουμε καμία παράμετρο, οπότε η PHP θα επιστρέψει έναν τυχαίο αριθμό ανάμεσα στο 1 και σ’ έναν πολύ μεγάλο αριθμό ή μπορούμε να δώσουμε και τους δύο αριθμούς.

Ακολουθεί ένα παράδειγμα : 

<?php

$random = rand();

$randrange = rand(1, 10);

$mtrandrange = mt_rand(1, 100);

?>

Θα πρέπει να έχουμε υπόψη μας ότι και οι δύο αριθμοί που χρησιμοποιούνται ως παράμετροι είναι πιθανό να επιστραφούν. Δηλαδή, ο αριθμός $randrange μπορεί να πάρει μια οποιαδήποτε τιμή ανάμεσα στο 1 και το 10, με το 1 και το 10 να είναι πιθανά.

Όπως είπαμε και νωρίτερα, αν δεν περάσουμε κάποια τιμή ως παράμετρο στις συναρτήσεις rand() και mt_rand(), η PHP θα δημιουργήσει έναν τυχαίο αριθμό ανάμεσα στο 1 και σ’ έναν πολύ μεγάλο αριθμό. Για να μάθουμε ποιος είναι αυτός ο μέγιστος αριθμός, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση getrandmax() ή την αντίστοιχη mt_getrandmax().

Θα δούμε τώρα ένα παράδειγμα για το πώς μπορούμε να χρησιμοποιήσουμε την παραγωγή τυχαίων αριθμών για να δημιουργήσουμε διάφορους τυχαίους χαιρετισμούς στους επισκέπτες ενός Web site :

<?php

switch(rand(1, 6)) {

case 1:

$greet = 'Γεια σας!'; break;

case 2:

$greet = 'Καλωσήρθατε!'; break;

case 3:

$greet = 'Χαιρετισμοί!'; break;

case 4:

$greet = 'Καλή Πλοήγηση!'; break;

case 5:

$greet = 'Καλημέρα!'; break;

case 6:

$greet = 'Yo!'; break;

}

print $greet;

?>

Θα πρέπει να έχουμε υπόψη μας ότι η ταχύτητα της δημιουργίας τυχαίων αριθμών δεν εξαρτάται από το μέγεθος των αριθμών που δίνουμε ως παραμέτρους στη συνάρτηση, δηλ. η rand() είναι το ίδιο γρήγορη με την rand(1, 3) αλλά και με την rand(1, 10000000). Οι περισσότερες γεννήτριες τυχαίων αριθμών χρειάζονται έναν σπόρο (seed), δηλ. μια αρχική τιμή καθώς οι αριθμοί που δημιουργούν δεν είναι στην πραγματικότητα τυχαίοι, αλλά ψευδο-τυχαίοι (pseudo-random).

Η τιμή seed χρησιμοποιείται για να παραχθεί ο πρώτος αριθμός, μετά ο πρώτος αριθμός χρησιμοποιείται για να παραχθεί ο δεύτερος αριθμός, μετά ο δεύτερος για τον τρίτο κοκ, που σημαίνει ότι αν δίνουμε πάντα την ίδια τιμή seed θα λαμβάνουμε πάντα την ίδια σειρά τυχαίων αριθμών. Αν τώρα δώσουμε έναν τυχαίο αριθμό ως seed στη γεννήτρια δημιουργίας τυχαίων αριθμών (random number generator), θα έχουμε ως αποτέλεσμα μια καθαρή σειρά τυχαίων αριθμών.

Η συνάρτηση seed για την rand() είναι η srand() και δέχεται μία παράμετρο, που είναι ένας ακέραιος αριθμός, για την τιμή seed. Αν χρησιμοποιούμε τη συνάρτηση mt_rand(), θα πρέπει αντίστοιχα να χρησιμοποιήσουμε τη συνάρτηση mt_srand(). Η συνάρτηση microtime(), που επιστρέφει ως έναν αριθμό κινητής υποδιαστολής τα εκατομμυριοστά του δευτερολέπτου, αποτελεί μια πολύ καλή λύση δημιουργίας τυχαίου αριθμού για χρήση ως παράμετρο seed, αρκεί να μετατραπεί το αποτέλεσμά της σε ακέραιο.

Μπορούμε να μετατρέψουμε το αποτέλεσμα της συνάρτησης microtime() σε ακέραιο, πολλαπλασιάζοντας το με το ένα εκατομμύριο (106), ως εξής : 

srand((double)microtime()*1000000);

mt_srand((double)microtime()*1000000 );

Αν θέλουμε τώρα να δημιουργείται πάντα η ίδια σειρά τυχαίων αριθμών, θα πρέπει να δίνουμε την ίδια τιμή seed. Για παράδειγμα, ανεξάρτητα από το πόσες φορές θα το τρέξουμε, το επόμενο script δημιουργεί πάντα τους ίδιους τυχαίους αριθμούς :

<?php

mt_srand(123456);

echo mt_rand(1, 100), "\n";

echo mt_rand(1, 100), "\n";

echo mt_rand(1, 100), "\n";

?>

 

Οι Τριγωνομετρικές Συναρτήσεις

float sin ( float value)

float cos ( float value)

float tan ( float value)

float asin ( float value)

float acos ( float value)

float atan ( float value)

float deg2rad ( float value)

float rad2deg ( float value)

Για να υπολογίσουμε τους βασικούς τριγωνομετρικούς αριθμούς του ημιτόνου (sine), συνημιτόνου (cosine) και εφαπτομένης (tangent) μπορούμε να καλέσουμε τις συναρτήσεις sin(), cos() και tan(), ενώ για να υπολογίσουμε το τόξο ημιτόνου (arc sine), το τόξο συνημιτόνου (arc cosine) και το τόξο εφαπτομένης (arc tangent) μπορούμε να καλέσουμε τις συναρτήσεις asin(), acos() και atan().

Και οι έξι αυτές συναρτήσεις δέχονται μία μόνο παράμετρο, συγκεκριμένα οι τρεις πρώτες την τιμή της γωνίας σε ακτίνια (radians) και οι τρεις τελευταίες λαμβάνουν το αποτέλεσμα από τις τρεις πρώτες για να επιστρέψουν τον αριθμό των ακτινίων (radians).

Για να υπολογίσουμε την τιμή μιας γωνίας σε ακτίνια (radians) πρέπει να πολλαπλασιάσουμε την τιμή της σε μοίρες (degrees) με την σταθερά π και μετά να διαιρέσουμε με το 180. Η PHP διαθέτει τη συνάρτηση deg2rad(), που μπορούμε να καλέσουμε για να κάνουμε τη μετατροπή της τιμής μιας γωνίας από μοίρες σε ακτίνια.

Ακολουθούν μερικά παραδείγματα χρήσης των παραπάνω συναρτήσεων :

<?php

$sin1 = sin(10);

$sin2 = sin(deg2rad(80));

$cos1 = cos(89);

$cos2 = cos(deg2rad(9));

?>

Αν εφαρμόσουμε τη συνάρτηση atan() σ’ έναν αριθμό και μετά εφαρμόσουμε τη συνάρτηση tan() στο αποτέλεσμα που θα παραχθεί, θα επανέλθουμε στον αρχικό αριθμό.

Ακολουθεί ένα παράδειγμα : 

<?php

$sin1 = sin(deg2rad(80));

$asin1 = rad2deg(asin($sin1));

?> 

Στον παραπάνω κώδικα, η μεταβλητή $asin1 θα έχει την τιμή 80. Όπως μπορούμε να φανταστούμε, η συνάρτηση rad2deg() είναι η αντίστροφη της συνάρτησης deg2rad(), δηλ. μετατρέπει την τιμή μιας γωνίας από ακτίνια (radians) σε μοίρες (degrees).

 

Άλλες Μαθηματικές Συναρτήσεις Μετατροπής

number abs ( number value)

float sqrt ( float value)

number pow ( number base, number exponent)

float hypot ( float num1, float num2)

Υπάρχουν αρκετές μαθηματικές συναρτήσεις μετατροπής αριθμών, από τις οποίες οι σημαντικότερες είναι οι abs(), sqrt() και pow(). Η συνάρτηση abs() επιστρέφει την απόλυτη τιμή (absolute value) της παραμέτρου που της μεταβιβάζουμε.

Ακολουθεί ένα παράδειγμα :

<?php

abs(10);

abs(-14);

?>

Η πρώτη γραμμή επιστρέφει την τιμή 10 και η δεύτερη γραμμή την τιμή 14. Η συνάρτηση abs() μπορεί να δεχθεί ακεραίους (integers) ή και πραγματικούς αριθμούς (floats) ως παράμετρο και επιστρέφει τον ίδιο τύπο :

<?php

abs(10.1);

abs(-14.5);

?>

Η πρώτη γραμμή επιστρέφει την τιμή 10.1 και η δεύτερη γραμμή την τιμή 14.5.

Η συνάρτηση sqrt() υπολογίζει την τετραγωνική ρίζα (square root) ενός θετικού αριθμού : 

<?php

print sqrt(25);

print sqrt(26);

?>

Η πρώτη γραμμή θα επιστρέψει την τιμή 5 και η δεύτερη γραμμή την τιμή 5.0990195135928. Θα πρέπει να έχουμε υπόψη μας ότι η κλήση της συνάρτησης sqrt() καθυστερεί την εκτέλεση του προγράμματος, έτσι θα πρέπει να αποφεύγουμε τις πολλαπλές κλήσεις της.

Τέλος, η συνάρτηση pow() δέχεται δύο παραμέτρους, μια βάση (base) και μια δύναμη (power) στην οποία θα υψωθεί η βάση. Ακολουθούν παραδείγματα : 

<?php

print pow(10, 2);         // 100

print pow(10, 3);         // 1000

print pow(10, 4);         // 10000

print pow(-10, 4);        // 10000

?>

Οι τρεις πρώτες γραμμές δείχνουν το αποτέλεσμα των πολλαπλασιασμών 10 * 10, 10 * 10 * 10 και 10 * 10 * 10 * 10. Στην τέταρτη γραμμή έχουμε ως βάση (πρώτη παράμετρος) το -10, κάτι που η συνάρτηση pow() το δέχεται. Η συνάρτηση pow() δέχεται ακόμη και αρνητικές δυνάμεις για τη δεύτερη παράμετρο, οπότε δεν παράγει αρνητικούς αλλά μικρούς αριθμούς. Για παράδειγμα, η εντολή pow(10, -1) έχει ως αποτέλεσμα το 0.1, η pow(10, -2) το 0.01, η pow(10, -3) το 0.001 κοκ.

Υπάρχει και η συνάρτηση hypot(), η οποία λαμβάνει δύο παραμέτρους, X και Y, και επιστρέφει την τιμή sqrt((X * X) + (Y * Y)), δηλ. το μήκος ενός διανύσματος ή την υποτείνουσα (hypotenuse) ενός ορθογωνίου τριγώνου.

 

Μετατροπή Αριθμών σε Άλλα Συστήματα Αρίθμησης

int bindec ( string binary_string)

string decbin ( int number)

string dechex ( int number)

string decoct ( int number)

int hexdec ( string hex_string)

int octdec ( string octal_string)

string base_convert ( string number, int from_base, int to_base)

Μπορούμε να αλλάξουμε τη βάση (base) του συστήματος αρίθμησης που χρησιμοποιούμε, όπως είναι το δεκαδικό σύστημα αρίθμησης όπου η βάση είναι το 10. Σ’ ένα σύστημα αρίθμησης που έχει ως βάση το b, χρησιμοποιούμε τα ψηφία 0, 1, ..., b-1 για να σχηματίσουμε όλους τους δυνατούς αριθμούς του συστήματος. Στο δεκαδικό σύστημα (με βάση το 10) χρησιμοποιούμε ως ψηφία τους αριθμούς 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 και  στο οκταδικό σύστημα (με βάση το 8) χρησιμοποιούμε ως ψηφία τους αριθμούς 0, 1, 2, 3, 4, 5, 6, 7.

Τρία είναι τα συστήματα αρίθμησης, εκτός του δεκαδικού, που είναι δημοφιλή σ’ όσους ασχολούνται με τους υπολογιστές, το δυαδικό (binary) με βάση το 2, το οκταδικό (octal) με βάση το 8 και το δεκαεξαδικό (hexadeci-mal) με βάση το 16. Στο δυαδικό σύστημα έχουμε μόνο δύο ψηφία, το 0 και το 1, ενώ στο δεκαεξαδικό σύστημα έχουμε 16 ψηφία, που είναι τα γνωστά μας 0-9 αλλά και τα A (10), B (11), C (12), D (13), E (14) και F (15).

Για παράδειγμα, ας δούμε τον δεκαδικό αριθμό 39 σε τέσσερα διαφορετικά συστήματα αρίθμησης : 

Για να μετατρέψουμε τον δεκαεξαδικό αριθμό 27 σε δεκαδικό, πολλαπλασιάζουμε το ψηφίο 2 του αριθμού με το 16 και προσθέτουμε το 7, οπότε έχουμε το 39. Αν ο δεκαεξαδικός αριθμός ήταν ο 2F8, θα έπρεπε να πολλαπλασιάσουμε το ψηφίο 2 με το 256 (256 = 16 * 16), το ψηφίο F με το 16 και να προσθέσουμε το 8, οπότε έχουμε τον δεκαδικό αριθμό 760. Αν όλα αυτά μας φαίνονται παράξενα, δεν θα πρέπει να ξεχνάμε ότι και στο δεκαδικό σύστημα αρίθμησης με το οποίο είμαστε εξοικειωμένοι, ο αριθμός 569 για παράδειγμα, προκύπτει αν πολλαπλασιάσουμε το 5 με το 100 (100 = 10 * 10), μετά το 6 με το 10 και προσθέτουμε και το 9.

Για τη μετατροπή από το ένα σύστημα αρίθμησης στο άλλο, η PHP διαθέτει αρκετές συναρτήσεις : bindec(), decbin(), dechex(), decoct(), hexdec() και octdec(). Η δουλειά που κάνει η κάθε συνάρτηση προκύπτει από την ονομασία της, όπως για παράδειγμα η bindec() που μετατρέπει έναν δυαδικό bin(ary) σε δεκαδικό dec(imal) και η dechex() που μετατρέπει έναν δεκαδικό dec(imal) σε δεκαεξαδικό hex(adecimal).

Η κάθε συνάρτηση δέχεται μία μόνο παράμετρο, που είναι ο αριθμός που θα μετατραπεί στο νέο σύστημα αρίθμησης, όπως για παράδειγμα : 

<?php

print decbin(16);         // 10000

print dechex(232);       // e8

print hexdec(e8);         // 232

?>

Βλέπουμε ότι όλες οι παραπάνω συναρτήσεις μετατρέπουν από ή προς το δεκαδικό σύστημα σ’ ένα άλλο σύστημα αρίθμησης. Η PHP διαθέτει και την πολύ χρήσιμη συνάρτηση base_convert() για να μπορούμε να κάνουμε μετατροπή ενός αριθμού από ένα σύστημα αρίθμησης σ’ ένα άλλο. Η συνάρτηση αυτή δέχεται τρεις παραμέτρους, που είναι με τη σειρά ο αριθμός που θέλουμε να μετατρέψουμε, η βάση του συστήματος από το οποίο θα γίνει η μετατροπή και η βάση του συστήματος προς το οποίο θα γίνει η μετατροπή.

Για παράδειγμα, οι επόμενες δύο εντολές είναι ισοδύναμες :

<?php

print decbin(16);

print base_convert(16, 10, 2);

?>

Η δεύτερη εντολή μετατρέπει τον αριθμό 16 από το δεκαδικό στο δυαδικό σύστημα. Το μεγάλο πλεονέκτημα της συνάρτησης base_convert() είναι ότι μπορούμε να μετατρέψουμε έναν δυαδικό αριθμό απευθείας σε δεκαεξαδικό ή και να κάνουμε πιο περίεργους συνδυασμούς, όπως μετατροπή ενός αριθμού από το οκταδικό στο σύστημα με βάση το 12 (duodecimal) ή από το δεκαεξαδικό στο σύστημα με βάση το 20 (vigesimal).

Κάτι που έχουμε ήδη διαπιστώσει είναι ότι τα ψηφία πάνω από το 9 παριστάνονται με γράμματα του λατινικού αλφαβήτου. Έτσι, στο δεκαεξαδικό σύστημα αρίθμησης έχουμε τα ψηφία 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E και F, ενώ στο σύστημα αρίθμησης με βάση το 20 (vigesimal), έχουμε τα ψηφία 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, H, I και J.

Με δεδομένο το ότι υπάρχουν 10 αριθμητικά ψηφία από το 0 έως και το 9 και 26 γράμματα από το A έως και το Z, η μέγιστη βάση συστήματος αρίθμησης που μπορεί να υποστηρίξει η PHP είναι το 36.

Ακολουθούν μερικά ακόμα παραδείγματα χρήσης της συνάρτησης base_convert() :

<?php

print base_convert(556, 10, 2);    // 1000101100

print base_convert(556, 10, 8);    // 1054

print base_convert(556, 10, 20);  // 17g

print base_convert(556, 10, 36);  // fg

?>

Όπως βλέπουμε, όσο μεγαλύτερη είναι η βάση του συστήματος αρίθμησης, τόσο πιο σύντομος είναι ο αριθμός που προκύπτει.

 

Οι Μαθηματικές Σταθερές

Η PHP διαθέτει μερικές ενσωματωμένες μαθηματικές σταθερές, όπως είναι ο γνωστός αριθμός π (Pi), για τον οποίο υπάρχει η σταθερά M_PI. Για παράδειγμα, για να υπολογίσουμε το εμβαδόν ενός κύκλου με βάση την ακτίνα του r, ο τύπος είναι a = pi * r2. Στην PHP μπορούμε να γράψουμε τον εξής κώδικα :

<?php

$area = M_PI * ($radius * $radius);

// ή

$area = M_PI * pow($radius, 2);

?>

Ακολουθεί μια λίστα με τις πιο χρήσιμες μαθηματικές σταθερές που διαθέτει η PHP :

Σταθερά

Τιμή

Σημασία

M_PI

3.14159265358979323846

Pi

M_PI_2

1.57079632679489661923

Pi/2

M_PI_4

0.78539816339744830962

Pi/4

M_1_PI

0.31830988618379067154

1/Pi

M_2_PI

0.63661977236758134308

2/Pi

M_SQRTPI

1.77245385090551602729

sqrt(M_PI)

M_2_SQRTPI

1.12837916709551257390

2/sqrt(M_PI)

M_SQRT2

1.41421356237309504880

sqrt(2)

M_SQRT3

1.73205080756887729352

sqrt(3)

M_SQRT1_2

0.70710678118654752440

1/sqrt(2)

 

back.gif (9867 bytes)

Επιστροφή