Ένας array στην PHP είναι στην πραγματικότητα ένας ταξινομημένος χάρτης (map). Ένας χάρτης είναι ένας τύπος που αντιστοιχεί τις τιμές σε κλειδιά. Αυτός ο τύπος έχει βελτιστοποιηθεί με πολλούς τρόπους, έτσι ώστε να μπορείτε να τον χρησιμοποιήσετε σαν πραγματικό array, ή ως λίστα (vector), hashtable (το οποίο είναι μια υλοποίηση ενός map), ευρετήριο, συλλογή, στοίβα, ουρά και πιθανώς και άλλα. Επειδή μπορείτε να έχετε και άλλον PHP-array ως τιμή, μπορείτε επίσης σχετικά εύκολα να προσομοιώσετε δέντρα (trees).
Η εξήγηση τέτοιων δομών είναι πέρα από τους σκοπούς αυτού του manual, αλλά θα βρείτε τουλάχιστο ένα παράδειγμα για κάθε μια από αυτές τις δομές. ΓΙα περισσότερες πληροφορίες σας παραπέμπουμε σε εξωτερική βιβλιογραφία σχετικά με αυτό το ευρύ θέμα.
Ένας array μπορεί να δημιουργηθεί από τη γλωσσική δομή (language-construct) array(). Απαιτείται ένας ορισμένος αριθμός από key => ζεύγη τιμών που χωρίζονται με κόμματα.
array( [key =>] value , ... ) // key may be an integer or string // value may be any value |
Ένα κλειδί (key) είναι είτε integer είτε string. Αν ένα key είναι η standard αναπαράσταση ενός integer, τότε θα ερμηνευθεί ως τέτοια (π.χ. το "8" θα ερμηνευθεί ως 8, ενώ το "08" θα ερμηνευθεί ως "08"). Δεν υπάρχουν διαφορετικοί indexed και associative τύποι από arrays στην PHP, υπάρχει μόνο ένας τύπος array, που μπορεί να περιέχει τόσο ακέραια όσο και string ευρετήρια.
Μια τιμή μπορεί να είναι οποιουδήποτε PHP τύπου.
<?php |
Αν παραλέιψετε ένα κλειδί, το μέγιστο του ακέραιου-ευρετηρίου λαμβάνεται, και το νέο κλειδί θα είναι αυτό το μέγιστο + 1. Αν καθορίσετε ένα κλειδί που του έχει ήδη ανατεθεί μια τιμή, αυτή η τιμή θα επικαλυφθεί από τη νέα (overwritten).
<?php |
Ðñïåéäïðïßçóç |
Όσον αφορά την PHP 4.3.0, η συμπεριφορά παραγωγής του index που περιγράφηκε παραπάνω έχει αλλάξει. Τώρα, αν προσθέσετε σε έναν πίνακα του οποίου το τρέχον μέγιστο κλειδί είναι αρνητικό, τότε το επόμενο κλειδί που θα δημιουργηθεί θα είναι μηδέν (0). Παλιότερα, το καινούριο index θα είχε οριστεί στο μεγαλύτερο υπάρχον κλειδί + 1, όπως συμβαίνει και με τις θετικές τιμές. |
Χρησιμοποιώντας το TRUE ως κλειδί θα υπολογιστεί ο ακέραιος 1 ως κλειδί. Χρησιμοποιώντας το FALSE ως κλειδί θα υπολογιστεί ο ακέραιος 0 ως κλειδί. Χρησιμοποιώντας το NULL ως κλειδί θα έχουμε ως αποτέλεσμα ένα κενό string. Χρησιμοποιώντας ένα κενό string ως κλειδί θα δημιουργηθεί (ή επανεγγραφεί) ένα κλειδί με ένα κενό string και η τιμή του δε θα είναι η ίδια με αυτή που θα είχαμε αν χρησιμοποιούσαμε κενές παρενθέσεις.
Δεν μπορείτε να χρησιμοποιήσετε arrays ή objects ως κλειδιά. Αν το κάνετε θα εμφανιστεί η προειδοποίηση: Illegal offset type.
Μπορείτε επίσης να αλλάξετε έναν υπάρχον array, ορίζοντας ρητά τιμές σ'αυτόν.
Αυτό γίνεται αναθέτοντας τιμές στον array ενώ συγχρόνως καθορίζεται το κλειδί στις παρενθέσεις. Μπορείτε βέβαια να παραλήψετε το κλειδί και να προσθέσετε ένα κενό ζευγάρι από παρενθέσεις ("[]") στο όνομα της μεταβλητής στην περίπτωση αυτή.
$arr[key] = value; $arr[] = value; // key is either string or nonnegative integer // value can be anything |
<?php |
Óçìåßùóç: Όπως έχει προαναφερθεί, αν γράψετε τις παρανεθέσεις χωρίς να ορίσετε κάποιο κλειδί, τότε ο μέγιστος από τους υπάρχοντες ακεραίους λαμβάνεται, και το καινούριο κλειδί θα είναι αυτή η μέγιστη τιμή + 1 . Αν δεν υπάρχει κάποιος ακέραιος ακόμη, το κλειδί θα είναι 0 (μηδέν). Αν ορίσετε ένα κλειδί που έχει ήδη μια τιμή αυτή η τιμή θα γραφτεί από πάνω (overwritten).
Ðñïåéäïðïßçóç Όσον αφορά την PHP 4.3.0, η συμπεριφορά παραγωγής του index που περιγράφηκε παραπάνω έχει αλλάξει. Τώρα, αν προσθέσετε σε έναν πίνακα του οποίου το τρέχον μέγιστο κλειδί είναι αρνητικό, τότε το επόμενο κλειδί που θα δημιουργηθεί θα είναι μηδέν (0). Παλιότερα, το καινούριο index θα είχε οριστεί στο μεγαλύτερο υπάρχον κλειδί + 1, όπως συμβαίνει και με τις θετικές τιμές.
Σημειώστε ότι το μέγιστο ακέραιο κλειδί που χρησιμοποιείται δεν χρειάζεται απαραιτήτως να υπάρχει στον πίνακα. Απλά πρέπει να υπήρχε στον πίνακα κάποια στιγμή από την τελευταία φορά που έγινε στον πίνακα αναταξινόμηση (re-index). Το ακόλουθο παράδειγμα δείχνει τα παραπάνω:
<?php
// Create a simple array.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Now delete every item, but leave the array itself intact:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Append an item (note that the new key is 5, instead of 0 as you
// might expect).
$array[] = 6;
print_r($array);
// Re-index:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>Το παραπάνω παράδειγμα θα παρήγαγε το ακόλουθο αποτέλεσμα:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Υπάρχουν αρκετές χρήσιμες συναρτήσεις για να δουλέψετε με arrays, δείτε το τμήμα Συναρτήσεις για arrays .
Óçìåßùóç: Η συνάρτηση unset() σας επιτρέπει να κάνετε unset στα κλειδιά ενός array. Πρέπει να λάβετε υπόψη ότι ο array ΔΕΝ θα ξαναταξινομηθεί. Μόνο αν χρησιμοποιήσετε το "usual integer indices" (αρχίζοντας από το μηδέν, και αυξάνοντας κατά ένα), θα μπορέσετε να πετύχετε την αναταξινόμηση χρησιμοποιώντας την array_values().
Η δομή ελέγχου foreach υπάρχει ειδικά για τους arrays. Παρέχει έναν εύκολο τρόπο για να προσπελαύνετε έναν array.
Πρέπει πάντα να χρησιμοποιείτε εισαγωγικά έξω από ένα ευρετήριο ενός associative array. Για παράδειγμα, χρησιμοποιήστε την $foo['bar'] και όχι την $foo[bar]. Αλλά γιατί είναι η $foo[bar] λανθασμένη; Ίσως έχετε δει τον ακόλουθο τρόπο σύνταξης σε παλιότερα scripts:
Αυτό είναι λάθος, αλλά δουλεύει. Τότε, γιατί είναι λάθος? Ο λόγος είναι ότι αυτός ο κώδικας έχει μια απροσδιόριστη σταθερά (την bar) παρά ένα string ('bar' - προσέξτε τα εισαγωγικά), και η PHP ίσως μελλοντικά ορίσει σταθερές οι οποίες, δυστυχώς για τον κώδικα σας, έχουν το ίδιο όνομα. Δουλεύει, επειδή η PHP αυτόματα μετατρέπει ένα bare string (είναι ένα string χωρίς εισαγωγικά που δεν αντιστοιχεί σε κάποιο γνωστό σύμβολο) σε string που περιέχει το bare string. Για παράδειγμα, αν δεν υπάρχει κάποιο ορισμένη σταθερά με το όνομα bar, τότε η PHP θα αντικαταστήσει το string 'bar' και θα χρησιμοποιεί αυτό.Óçìåßùóç: Αυτό δε σημαίνει να βάζετε πάνταalways εισαγωγικά στο κλειδί. Δεν θέλετε να βάζετε εισαγωγικά στα κλειδιά που είναι σταθερές ή μεταβλητές, καθώς αυτό θα εμποδίζει την PHP από το να τα μεταγλωττίσει.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Simple array:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nChecking $i: \n";
echo "Bad: " . $array['$i'] . "\n";
echo "Good: " . $array[$i] . "\n";
echo "Bad: {$array['$i']}\n";
echo "Good: {$array[$i]}\n";
}
?>Óçìåßùóç: Το αποτέλεσμα από το παραπάνω θα είναι:
Checking 0: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 1 Checking 1: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 2
Περισσότερα παραδείγματα για να δείξουν το παραπάνω:
<?php |
Όταν ενεργοποιήσετε το error_reporting() να εμφανίζει E_NOTICE για level errors (όπως το να τεθεί στη σταθερά E_ALL) τότε θα δείτε αυτά τα λάθη. Η προκαθορισμένη ρύθμιση είναι, το error_reporting να μην έχει ενεργοποιημένη τη ρύθμιση για εμφάνιση τους.
Όπως έχει δηλωθεί στο τμήμα σύνταξης , πρέπει να υπάρχει μια έκφραση μεταξύ στις αγκύλες ('[' και ']'). Αυτό σημαίνει ότι μπορείτε να γράψετε πράγματα όπως αυτό:
Αυτό είναι ένα παράδειγμα χρήσης μιας συνάρτησης που επιστρέφει κάποια τιμή ως δείκτη πίνακα (array index). Η PHP επίσης γνωρίζει τις σταθερές, όπως θα έχετε δει E_* και προηγουμένως.
<?php |
<?php |
Όπως έχουμε ήδη εξηγήσει σε προηγούμενα παραδείγματα, η $foo[bar] δουλεύει ακόμη αλλά είναι λάθος. Δουλεύει, επειδή bar εξαιτίας της σύνταξης της αναμένεται να είναι μια σταθερή έκφραση. Πάντως, σ'αυτή την περίπτωση καμία σταθερά με το όνομα bar δεν υπάρχει. Η PHP τώρα υποθέτει ότι εννοούσατε την bar κυριολεκτικά, όπως το string "bar", αλλά έχετε ξεχάσει να γράψετε τα εισαγωγικά.
Σε κάποια στιγμή στο μέλλον, η ομάδα της PHP ίσως θελήσει να προσθέσει και κάποια άλλη σταθερά ή keyword, ή μπορεί εσείς να θέλετε να εισάγετε κάποια σταθερά στην εφαρμογή σας, και τότε να αντιμετωπίσετε πρόβλημα. Για παράδειγμα, δεν μπορείτε ήδη να χρησιμοποιήσετε τις λέξεις empty και default μ'αυτόν τον τρόπο, αφού είναι ιδιαίτερες δεσμευμένες λέξεις.
Óçìåßùóç: Για επανάληψη, μέσα σε ένα string με διπλα εισαγωγικά, είναι έγκυρο να μην περιλαμβάνετε array indexes με εισαγωγικά, συνεπώς το "$foo[bar]" είναι έγκυρο. Δείτε τα παραπάνω παραδείγματα για λεπτομέρειες σχετικά με το γιατί όπως επίσης το τμήμα σχετικά με το πέρασμα μεταβλητών σε strings.
Για οποιοδήποτε από τους τύπους: integer, float, string, boolean και resource, αν μετατρέψετε μια τιμή σε array, παίρνετε έναν array με ένα στοιχείο (με index 0), το οποίο είναι η βαθμωτή τιμή με την οποία αρχίσατε.
Αν μετατρέψετε ένα object σε έναν array, παίρνετε τις ιδιότητες (μεταβλητές μελών) αυτού του αντικειμένου ως στοιχεία του array. Τα κλειδιά είναι τα ονόματα των μεταβλητών μελών.
Αν μετατρέψετε μια NULL τιμή σε array, παίρνετε έναν κενό array.
Ο τύπος array στην PHP είναι πολύ ευπροσάρμοστος, έτσι εδώ θα δείτε μερικά παραδείγματα που θα σας δείξουν τις πολλές δυνατότητες των arrays.
<?php |
Σημειώστε ότι προς το παρόν δεν είναι δυνατό να αλλάξουμε τις τιμές του array άμεσα σε ένα τέτοιο loop. Δείτε το ακόλουθο:
Αυτό το παράδειγμα δημιουργεί έναν one-based array.
Οι arrays είναι διατεταγμένοι. Μπορείτε επίσης να αλλάξετε τη σειρά χρησιμοποιώντας διάφορες συναρτήσεις ταξινόμησης. Δείτε το τμήμα συναρτήσεις για arrays για περισσότερες πληροφορίες. Μπορείτε να μετρήσετε τον αριθμό των στοιχείων σε ένα array χρησιμοποιώντας τη συνάρτηση count() .
Επειδή η τιμή ενός array μπορεί να είναι οτιδήποτε, μπορεί επίσης να είναι ένας άλλος array. Μ'αυτόν τον τρόπο μπορείτε να κάνετε αναδρομικούς και πολυδιάστατους arrays.
ÐáñÜäåéãìá 11-10. Αναδρομικοι και πολυδιάστατοι arrays
|
Πρέπει να προσέχετε επειδή οι αναθέσεις των array πάντα εμπλέκουν αντιγραφή τιμών. Θα χρειαστεί να χρησιμοποιήσετε τον τελεστή αναφοράς για να αντιγράψετε έναν array με αναφορά.