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

Η Βίβλος της PHP - Μέρος 4 -
Οι Πίνακες (Arrays)

 

Εισαγωγή στους Πίνακες (Arrays)

Μέχρι τώρα έχουμε δει τους βασικούς τύπους μεταβλητών, όπως είναι τα strings και οι ακέραιοι (integers), όπως επίσης και τις συναρτήσεις (functions) με τις οποίες μπορούμε να χειριστούμε αυτούς τους τύπους δεδομένων. Εκτός όμως από τους βασικούς τύπους δεδομένων υπάρχουν οι πίνακες (arrays) και τα αντικείμενα (objects), που θέλουν λίγη περισσότερη εργασία για να μπορέσουμε να εκμεταλλευτούμε τις δυνατότητές τους.

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

 

Οι Βασικές Συναρτήσεις Πινάκων

array array ( [mixed ...])

int count ( mixed var [, int mode])

bool print_r ( mixed expression [, bool return])

void var_dump ( mixed expression [, mixed expression [, mixed ...]])

mixed var_export ( mixed expression [, bool return])

Στην PHP μπορούμε να δημιουργήσουμε έναν πίνακα με δύο τρόπους, είτε με τη συνάρτηση array ή με τους ειδικούς τελεστές [ ]. Πριν συνεχίσουμε με τους πίνακες, θα πρέπει να κατανοήσουμε δύο βασικά πράγματα :

Ας δούμε τον παρακάτω κώδικα σε PHP :

<?php

$myarray = array("Grevena", "Kastoria", "Kozani", "Florina");

$size = count($myarray);

print_r($myarray);

?>

Στην πρώτη γραμμή βλέπουμε τον πιο απλό τρόπο για να δημιουργήσουμε έναν πίνακα, τη συνάρτηση array(), η οποία δέχεται μία τουλάχιστον παράμετρο και επιστρέφει έναν πίνακα που περιέχει τις παραμέτρους που δηλώνουμε, οπότε στο συγκεκριμένο παράδειγμα ο πίνακας $myarray θα περιέχει τέσσερις μεταβλητές. Στη δεύτερη γραμμή υπάρχει η συνάρτηση count() που επιστρέφει τον αριθμό των στοιχείων που υπάρχουν σ’ έναν πίνακα.

Η τρίτη γραμμή περιέχει τη συνάρτηση print_r(), η οποία δέχεται μία μόνο παράμετρο και εμφανίζει λεπτομερή στοιχεία για μια μεταβλητή, όπως είναι ο τύπος δεδομένων της, το μήκος της και τα περιεχόμενά της. Όσον αφορά τους πίνακες, η συνάρτηση print_r() εμφανίζει όλα τα στοιχεία του πίνακα. Η έξοδος της συνάρτησης print_r() από τον παραπάνω κώδικα είναι η εξής :

Array

( [0] => Grevena

[1] => Kastoria

[2] => Kozani

[3] => Florina )

Οι τιμές 0, 1, 2 και 3 είναι τα κλειδιά (keys) του πίνακα, ενώ οι τιμές (values) του πίνακα είναι οι "Grevena", "Kastoria", "Kozani" και "Florina". Τα κλειδιά και οι τιμές μαζί αποτελούν τα στοιχεία (elements) του πίνακα. Μπορούμε να δώσουμε μια δεύτερη παράμετρο στη συνάρτηση print_r(), που αν έχει την τιμή true θα κάνει την print_r() να μην εκτυπώσει κάτι αλλά να έχει ως τιμή επιστροφής την έξοδό της. Μπορούμε έτσι να έχουμε το ίδιο αποτέλεσμα με τον προηγούμενο κώδικα και με το εξής script :

<?php

$myarray = array("Grevena", "Kastoria", "Kozani", "Florina");

$size = count($myarray);

$output = print_r($myarray, true);

print $output;

?>

Μπορούμε να αποθηκεύσουμε ό,τι τιμές θέλουμε σ’ έναν πίνακα και μπορούμε να έχουμε και ανάμικτες τιμές, όπως array("Florina", 1, 9.995, "Kozani", $somevar). Μπορούμε επίσης να έχουμε και πίνακες μέσα σε πίνακες, που θα το δούμε αργότερα. Υπάρχει μια παρόμοια συνάρτηση με την print_r(), η var_dump(), που κάνει σχεδόν την ίδια δουλειά με τη διαφορά ότι :

1) εμφανίζει τα μεγέθη των μεταβλητών,

2) δεν εμφανίζει τα μη δημόσια δεδομένα των αντικειμένων και

3) δεν έχει την επιλογή για να δώσουμε μια δεύτερη παράμετρο για να επιστραφεί η έξοδός της.

Έτσι, αν αλλάξουμε το πρώτο script και χρησιμοποιήσουμε τη συνάρτηση var_dump() αντί για την print_r(), θα έχουμε την εξής έξοδο :

array(4) {

[0]=> string(7) "Grevena"

[1]=> string(8) "Kastoria"

[2]=> string(6) "Kozani"

[3]=> string(7) "Florina"

}

Βλέπουμε ότι η συνάρτηση var_dump() μάς λέει ότι ο πίνακας περιέχει τέσσερις τιμές και εμφανίζει επίσης τα μήκη όλων των τιμών, που είναι strings. Τέλος, υπάρχει και η συνάρτηση var_export(), που είναι παρόμοια με τις var_dump() και print_r(), αλλά με τη διαφορά ότι εμφανίζει πληροφορίες για τις μεταβλητές μ’ έναν τρόπο που μπορεί να χρησιμοποιηθεί ως κώδικας της PHP. Για παράδειγμα, αν είχαμε χρησιμοποιήσει την var_export() αντί για την print_r(), θα είχαμε το εξής αποτέλεσμα :

array (

0 => 'Grevena',

1 => 'Kastoria',

2 => 'Kozani',

3 => 'Florina',

)

Βλέπουμε ότι υπάρχει ένα επιπλέον κόμμα μετά από το τελευταίο στοιχείο, το οποίο αγνοείται από την PHP, και μπορούμε να κάνουμε αντιγραφή και επικόλληση του παραπάνω αποτελέσματος μέσα στα scripts, ως εξής :

<?php

$dm = array (

0 => 'Grevena',

1 => 'Kastoria',

2 => 'Kozani',

3 => 'Florina',

);

?>

Για να πάρουμε δεδομένα από έναν πίνακα, μπορούμε να χρησιμοποιήσουμε το όνομα του πίνακα και τον δείκτη (identifier) του στοιχείου του πίνακα, ως εξής :

$myarray = array("Grevena", "Kastoria", "Kozani", "Florina");

print $myarray[0];

print "<br>";

print $myarray[2];

Ο παραπάνω κώδικας θα εμφανίσει το παρακάτω αποτέλεσμα :

Grevena
Kozani

 

Οι Συσχετιζόμενοι Πίνακες (Associative Arrays)

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

<?php

$myarray = array("a"=>"Grevena", "b"=>"Kastoria", "c"=> "Kozani", "d"=> "Florina");

var_dump($myarray);

?> 

Αυτή τη φορά, η συνάρτηση var_dump() θα εμφανίσει τα εξής :

array(4) {

["a"]=> string(7) "Grevena"

["b"]=> string(8) "Kastoria"

["c"]=> string(6) "Kozani"

["d"]=> string(7) "Florina"

}

Όπως αναμενόταν, τα κλειδιά 0, 1, 2 και 3 αντικαταστάθηκαν με τα a, b, c και d, αλλά θα μπορούσαμε να είχαμε χρησιμοποιήσει για τα κλειδιά και τιμές όπως "Gr", "Ka", "Ko" και "Fl" ή ακόμα και μεταβλητές ή και άλλους πίνακες για τη θέση των κλειδιών (keys). Το να καθορίσουμε εμείς τις τιμές των κλειδιών δημιουργεί αυτό που είναι γνωστό με τον όρο συσχετιζόμενος πίνακας (associative array), δηλ. συσχετίζουμε ένα συγκεκριμένο κλειδί με μια συγκεκριμένη τιμή.

Προσοχή χρειάζεται όταν χρησιμοποιούμε δεκαδικούς αριθμούς καθώς η PHP τους μετατρέπει σε ακεραίους και έτσι ο παρακάτω κώδικας θα δημιουργήσει έναν πίνακα μ’ ένα μόνο στοιχείο :

<?php

$array[1.5] = "a";

$array[1.6] = "b";

?>

Η πρώτη γραμμή έχει το κλειδί 1.5, το οποίο στρογγυλοποιεί σε 1 και μετά αποθηκεύει την τιμή "a" στη θέση (index) 1, ενώ η δεύτερη γραμμή έχει το κλειδί 1.6, το οποίο επίσης μετατρέπει σε 1 και μετά αποθηκεύει την τιμή "b" στη θέση (index) 1, αντικαθιστώντας έτσι το "a". Αν θελήσουμε να χρησιμοποιήσουμε δεκαδικούς αριθμούς για κλειδιά, θα πρέπει να τους γράψουμε με τη μορφή string, ως εξής :

<?php

$array["1.5"] = "Florina";

$array["1.6"] = "Florina";

var_dump($array);

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

array(2) {

["1.5"]=>string(7) "Florina"

["1.6"]=>string(7) "Florina"

}

Ας δούμε και τον παρακάτω κώδικα :

<?php

$a = array("France"=>3, "Belgium"=>9, "Italy"=>4);

print $a["Italy"];

?>

Ο παραπάνω κώδικας θα εμφανίσει το 4, δηλ. την τιμή που έχουμε αποθηκεύσει για το κλειδί "Italy" καθώς εδώ το "Italy" δεν αποτελεί ένα string, αλλά απλά έναν δείκτη (index) ή ένα κλειδί (key).

 

Περιήγηση μέσα σε Πίνακες

void list ( mixed ...)

array each ( array input)

Θα πρέπει να είμαστε προσεκτικοί όταν χρησιμοποιούμε κλειδιά στους πίνακες της PHP και όχι ακέραιους αριθμούς αυξανόμενους κατά ένα, όπως έχουμε συνηθίσει από άλλες γλώσσες προγραμματισμού. Για παράδειγμα, ένας πίνακας μπορεί να περιέχει τα εξής κλειδιά : 0, 1, 2, 5, 3, 6, 7, δηλ. μπορεί να είναι ακέραιοι αριθμοί που να μην αυξάνουν κατά ένα ή να είναι και ανακατεμένοι.

Θα πρέπει συνεπώς να αποφεύγουμε κώδικα σαν τον παρακάτω :

<?php

for ($i = 0; $i < count($array); ++$i) {

print $array[$i];

}

?>

Ένας άλλος πιο σίγουρος τρόπος είναι ο εξής :

<?php

while (list($var, $val) = each($array)) {

print "Η τιμή του $var είναι $val\n";

}

?>

Η list() είναι μια συνάρτηση που μετατρέπει (διασπάει) ένα στοιχείο ενός πίνακα στα συστατικά του, δηλ. το κλειδί και την τιμή. Η συνάρτηση each() δέχεται έναν πίνακα (array) ως παράμετρο και επιστρέφει το τρέχον κλειδί και την τιμή του πριν προχωρήσει ο δρομέας του πίνακα (array cursor) στο επόμενο στοιχείο. Με τον όρο δρομέας του πίνακα αναφερόμαστε στο στοιχείο ενός πίνακα που διαβάζουμε σε μια συγκεκριμένη στιγμή (τρέχον).

Στο παραπάνω παράδειγμα, η συνάρτηση each() θα επιστρέψει το πρώτο στοιχείο του πίνακα, μετά το δεύτερο, μετά το τρίτο κοκ μέχρι να διαπιστώσει ότι δεν υπάρχουν άλλα στοιχεία, οπότε θα επιστρέψει την τιμή false και ο βρόχος θα τερματίσει. Αυτό που κάνει η πρώτη γραμμή του παραπάνω κώδικα είναι ότι λαμβάνει το τρέχον στοιχείο του πίνακα και εκχωρεί το κλειδί του (key) στη μεταβλητή $var και την τιμή του (value) στη μεταβλητή $val, μετά προχωράει τον δρομέα του πίνακα κοκ.

Ένας ακόμα πολύ καλός τρόπος για να περιηγηθούμε σ’ έναν πίνακα είναι να χρησιμοποιήσουμε τον βρόχο foreach, που έχει δύο τρόπους σύνταξης. Ο πιο απλός τρόπος είναι ο εξής :

foreach($array as $val) {

print $val;

}

Στην περίπτωση αυτή περιηγούμαστε στον πίνακα $array και οι τιμές του εξάγονται στη μεταβλητή $val. Σ’ αυτήν την περίπτωση αγνοούνται τελείως τα κλειδιά του πίνακα, κάτι που έχει νόημα στις περιπτώσεις που οι τιμές των κλειδιών είναι ακέραιοι αριθμοί που αυξάνονται κατά ένα, όπως 0, 1, 2, 3 κλπ. Ο δεύτερος τρόπος σύνταξης του βρόχου foreach μάς επιτρέπει να εξάγουμε και τις τιμές των κλειδιών, ως εξής :

foreach ($array as $key => $val) {

print "$key = $val\n";

}

Σε γενικές γραμμές, ο βρόχος foreach είναι ο καλύτερος τρόπος για να περιηγηθούμε σ’ έναν πίνακα.

 

Ο Τελεστής Πίνακα (Array Operator)

Ένας άλλος δημοφιλής τρόπος για να δημιουργήσουμε έναν πίνακα είναι να χρησιμοποιήσουμε τα σύμβολα [ ], που είναι γνωστά και με τον όρο τελεστής πίνακα (array operator). Μ’ αυτόν τον τρόπο, μπορούμε και να δημιουργήσουμε έναν πίνακα αλλά και να κάνουμε προσθήκη σ’ έναν υπάρχοντα πίνακα, ενώ η συνάρτηση array() χρησιμοποιείται συνήθως όταν θέλουμε να καταχωρήσουμε πολλές τιμές σ’ έναν πίνακα που να είναι γραμμένες σε μία γραμμή.

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

<?php

$array[] = "Grevena";

$array[] = "Kastoria";

$array[] = "Kozani";

$array[] = "Florina";

var_dump($array);

?>

Ο παραπάνω τρόπος είναι ακριβώς ο ίδιος με τη συνάρτηση array() με τη διαφορά ότι είναι πιο ευέλικτος καθώς μπορούμε να κάνουμε προσθήκη τιμών στον πίνακα οποτεδήποτε θέλουμε. Στην περίπτωση που θέλουμε να δώσουμε συγκεκριμένες τιμές στα κλειδιά του πίνακα, μπορούμε να γράψουμε τον εξής κώδικα :

<?php

$array["a"] = "Grevena";

$array["b"] = "Kastoria";

$array["c"] = "Kozani";

$array["d"] = "Florina";

var_dump($array);

?>

 

Επιστροφή Πίνακα από Συνάρτηση

Στην PHP μπορούμε να επιστρέψουμε (return) μία μόνο τιμή από τις συναρτήσεις χρήστη αλλά έχουμε τη δυνατότητα να κάνουμε αυτήν την τιμή να είναι ένας πίνακας (array), οπότε στην ουσία μπορούμε να επιστρέψουμε πολλές τιμές.

Ο παρακάτω κώδικας μάς δείχνει αυτό ακριβώς :

<?php

function dm() {

$array["a"] = "Grevena";

$array["b"] = "Kastoria";

$array["c"] = "Kozani";

$array["d"] = "Florina";

return $array;

}

$dytikimakedonia = dm();

print $dytikimakedonia["c"];

?>

Ο παραπάνω κώδικας θα επιστρέψει την τιμή "Kozani". Χωρίς να αναγκαστούμε να επιστρέψουμε έναν πίνακα, ο άλλος τρόπος για να στείλουμε δεδομένα πίσω στο script είναι να χρησιμοποιήσουμε παραμέτρους με αναφορά και να τις αλλάξουμε μέσα στη συνάρτηση.

 

Συναρτήσεις Ειδικές για Πίνακες

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

 

Αποκοπή και Αλλαγή Τιμών σε Πίνακες

array array_diff ( array array1, array array2 [, array ...])

array array_intersect ( array array1, array array2 [, array ...])

array array_merge ( array array1, array array2 [, array ...])

Υπάρχουν τρεις συναρτήσεις για να συγκρίνουμε δύο πίνακες και να δημιουργήσουμε έναν καινούργιο πίνακα. Όλες δέχονται δύο τουλάχιστον πίνακες ως παραμέτρους, που θα τους ονομάζουμε $arr1 και $arr2, και επιστρέφουν έναν πίνακα ως αποτέλεσμα (result).

Η διαφορά μεταξύ τους είναι ότι η συνάρτηση array_diff() επιστρέφει έναν καινούργιο πίνακα που περιέχει όλες τις τιμές του $arr1 που δεν υπάρχουν στον πίνακα $arr2, η συνάρτηση array_intersect() επιστρέφει έναν καινούργιο πίνακα που περιέχει όλες τις τιμές του $arr1 που υπάρχουν και στον $arr2 και η συνάρτηση array_merge() απλά συνενώνει τους δύο πίνακες.

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

<?php

$nomoi1 = array("Kastoria", "Kozani", "Imathia");

$nomoi2 = array("Imathia", "Kilkis", "Pella");

$intnomoi = array_intersect($nomoi1, $nomoi2);

$diffnomoi = array_diff($nomoi1, $nomoi2);

$bothnomoi = array_merge($nomoi1, $nomoi2);

var_dump($intnomoi);

var_dump($diffnomoi);

var_dump($bothnomoi);

?>

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

array(1) {

[2]=> string(7) "Imathia"

}

array(2) {

[0]=> string(8) "Kastoria"

[1]=> string(6) "Kozani"

}

array(6) {

[0]=> string(8) "Kastoria"

[1]=> string(6) "Kozani"

[2]=> string(7) "Imathia"

[3]=> string(7) "Imathia"

[4]=> string(6) "Kilkis"

[5]=> string(5) "Pella"

}

 

Απαλοιφή Διπλών Τιμών από Πίνακες

array array_unique ( array input)

Στο προηγούμενο παράδειγμα είδαμε ότι το string Imathia υπάρχει δύο φορές μέσα στον ίδιο πίνακα, ως εξής :

$nomoi = array("Kastoria", "Kozani", "Imathia", "Imathia", "Kilkis", "Pella");

Για να εξαλείψουμε τις διπλές τιμές από έναν πίνακα, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση array_unique(), η οποία δέχεται έναν πίνακα ως παράμετρο και επιστρέφει τον ίδιο πίνακα χωρίς τις τυχόν διπλές τιμές, ως εξής :

$nomoi = array_unique($nomoi);

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

array(5) {

[0]=> string(8) "Kastoria"

[1]=> string(6) "Kozani"

[2]=> string(7) "Imathia"

[4]=> string(6) "Kilkis"

[5]=> string(5) "Pella"

}

 

Φιλτράρισμα Πίνακα

array array_filter ( array input [, callback function])

Με τη συνάρτηση array_filter() μπορούμε να φιλτράρουμε στοιχεία ενός πίνακα μέσω μιας άλλης συνάρτησης. Αν η συνάρτηση επιστρέψει την τιμή true, τότε το στοιχείο υπάρχει μέσα στον πίνακα που επιστρέφεται, αλλιώς όχι.

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

<?php

function endswitha($value) {

return (substr($value, -1) == 'a');

}

$dm = array("Grevena", "Kastoria", "Kozani", "Florina");

$witha = array_filter($dm, "endswitha");

var_dump($witha);

?>

Εδώ έχουμε έναν πίνακα με τους τέσσερις νομούς της Δυτικής Μακεδονίας, όπου οι περισσότεροι καταλήγουν στο γράμμα "a". Θέλουμε να πάρουμε μια λίστα εκείνων των νομών που το ονόμά τους λήγει σε "a", έτσι χρησιμοποιούμε τη συνάρτηση array_filter().

Η συνάρτηση endswitha() επιστρέφει την τιμή true αν το τελευταίο γράμμα της κάθε τιμής του πίνακα τελειώνει σε a, αλλιώς επιστρέφει την τιμή false. Μεταβιβάζοντάς την ως τη δεύτερη παράμετρο στη συνάρτηση array_filter(), θα καλείται από μία φορά για το κάθε στοιχείο του πίνακα όπου θα ελέγχει αν υπάρχει το γράμμα "a" στο τέλος.

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

array(3) {

[0]=> string(7) "Grevena"

[1]=> string(8) "Kastoria"

[3]=> string(7) "Florina"

}

 

Μετατροπή Πίνακα σε Ανεξάρτητες Μεταβλητές

int extract ( array source [, int extract_type [, string prefix]])

Η συνάρτηση extract() μετατρέπει τα στοιχεία ενός πίνακα σε ανεξάρτητες μεταβλητές. Λαμβάνει μία τουλάχιστον παράμετρο, έναν πίνακα, και επιστρέφει τον αριθμό των στοιχείων που εξάγονται.

Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$Wales = 'Swansea';

$capitalcities['England'] = 'London';

$capitalcities['Scotland'] = 'Edinburgh';

$capitalcities['Wales'] = 'Cardiff';

extract($capitalcities);

print $Wales;

?>

Μετά την κλήση της συνάρτησης extract(), τα κλειδιά "England", "Scotland" και "Wales" γίνονται ανεξάρτητες μεταβλητές, δηλ. $England, $Scotland και $Wales, με τις τιμές "London", "Edinburgh" και "Cardiff", αντίστοιχα. Εξ ορισμού, η συνάρτηση extract() επικαλύπτει τις ήδη υπάρχουσες μεταβλητές, πράγμα που σημαίνει ότι η αρχική τιμή της μεταβλητής $Wales, που είναι η "Swansea", θα αντικατασταθεί από την "Cardiff".

 

Έλεγχος Ύπαρξης Στοιχείου Μέσα σε Πίνακα

bool in_array ( mixed needle, array haystack [, string strict])

Η συνάρτηση in_array() δέχεται ως παραμέτρους μια τιμή και έναν πίνακα και επιστρέφει την τιμή true αν η τιμή περιέχεται μέσα στον πίνακα, αλλιώς επιστρέφει την τιμή false. Ακολουθεί ένα παράδειγμα :

<?php

$nomos = "Florina";

$dm = array("Grevena", "Kastoria", "Kozani", "Florina");

if (in_array($nomos, $dm)) {

print "Ο νομός $nomos υπάρχει στον πίνακα\n";

} else {

print "Ο νομός $nomos δεν υπάρχει στον πίνακα\n";

}

?>

Η προαιρετική τρίτη παράμετρος της συνάρτησης in_array(), που είναι εξ ορισμού false, ορίζει αν θέλουμε να κάνουμε αυστηρό έλεγχο ή όχι. Αν τεθεί ίση με true, η PHP θα επιστρέψει true αν η τιμή περιέχεται μέσα στον πίνακα και είναι του ιδίου τύπου δεδομένων (θα πρέπει να θυμηθούμε τον τελεστή = = =).

 

Χρήση ενός Πίνακα ως Ουρά με Διπλά Άκρα

mixed array_shift ( array array)

int array_unshift ( array array, mixed var [, mixed ...])

int array_push ( array array, mixed var [, mix ...])

mixed array_pop ( array array)

Μια ουρά με διπλά άκρα, γνωστή ως deque (double-ended queue) μάς δίνει τη δυνατότητα να αποθηκεύσουμε στοιχεία σε μια δομή που θυμίζει πίνακα και μετά να δουλέψουμε είτε με το πρώτο είτε με το τελευταίο στοιχείο της ουράς. Αν και αυτή η δυνατότητα μπορεί να μην φαίνεται χρήσιμη, μπορούμε όμως να κάνουμε εργασίες όπως το να εισάγουμε μια μεταβλητή στην πρώτη θέση ενός πίνακα ή να διαβάσουμε το πρώτο στοιχείο ενός πίνακα και μετά να το αφαιρέσουμε από τον πίνακα.

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

<?php

$names = array("Kostas", "Antonis", "Sotiris", "Anna", "Maria");

$firstname = array_shift($names);

print $firstname. "<br>";

var_dump($names);

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι η μεταβλητή $firstname έχει την τιμή "Kostas" και ο πίνακας $names περιέχει όλες τις υπόλοιπες τιμές εκτός από την πρώτη. Για να απομακρύνουμε ένα στοιχείο από το τέλος ενός πίνακα, υπάρχει η συνάρτηση array_pop(), που λειτουργεί όπως και η array_shift().

Και οι δύο αυτές συναρτήσεις έχουν και τις αντίθετές τους, τις array_unshift() και array_push(), οι οποίες προσθέτουν ένα στοιχείο στην αρχή ή στο τέλος ενός πίνακα, αντίστοιχα.

Ακολουθεί ένα χαρακτηριστικό script :

<?php

$names = array("Kostas", "Antonis", "Sotiris", "Anna", "Maria");

$firstname = array_shift($names);

// Το πρώτο στοιχείο του $names είναι τώρα το Antonis

array_push($names, $firstname);

// Το Kostas είναι τώρα το τελευταίο στοιχείο του $names

$firstname = array_pop($names);

// Το Kostas αφαιρέθηκε από το τέλος του πίνακα

array_unshift($names, $firstname);

// Το Kostas είναι ξανά το πρώτο στοιχείο του $names

var_dump($names);

// Ο πίνακας επανήλθε στις αρχικές του τιμές

?>

 

Ανταλλαγή Κλειδιών και Τιμών σ’ έναν Πίνακα

array array_flip ( array input)

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

<?php

$capitalcities['Greece'] = 'Athens';

$capitalcities['Italy'] = 'Rome';

$capitalcities['Finland'] = 'Elsinki';

$flippedcities = array_flip($capitalcities);

var_dump($flippedcities);

?>

Μετά την εκτέλεση του παραπάνω script, θα έχουμε το εξής αποτέλεσμα :

array(3) {

["Athens"]=> string(6) "Greece"

["Rome"]=> string(5) "Italy"

["Elsinki"]=> string(8) "Finland"

}

Βλέπουμε ότι έγινε ανταλλαγή των κλειδιών (keys) με τις αντίστοιχες τιμές (values) του πίνακα.

 

Ταξινόμηση των Στοιχείων ενός Πίνακα

bool asort ( array input [, int sort_flags])

bool ksort ( array input [, int sort_flags])

bool arsort ( array input [, int sort_flags])

bool krsort ( array input [, int sort_flags])

Αν και υπάρχει μια βασική συνάρτηση ταξινόμησης πίνακα, η sort(), δεν διατηρεί τις τιμές των κλειδιών και έτσι κάνει περισσότερη ζημιά παρά καλό. Στη θέση της υπάρχουν οι συναρτήσεις asort() και ksort(), όπου η asort() ταξινομεί έναν πίνακα ως προς τις τιμές του (values), ενώ η ksort() ταξινομεί έναν πίνακα ως προς τα κλειδιά του (keys). Η διαφορά θα φανεί καλύτερα στο επόμενο script :

<?php

$capitalcities['Greece'] = 'Athens';

$capitalcities['Italy'] = 'Rome';

$capitalcities['Finland'] = 'Elsinki';

ksort($capitalcities);

var_dump($capitalcities);

asort($capitalcities);

var_dump($capitalcities);

?>

Μετά την εκτέλεση του παραπάνω script, θα έχουμε το εξής αποτέλεσμα :

array(3) {

["Finland"]=> string(7) "Elsinki"

["Greece"]=> string(6) "Athens"

["Italy"]=> string(4) "Rome"

}

array(3) {

["Greece"]=> string(6) "Athens"

["Finland"]=> string(7) "Elsinki"

["Italy"]=> string(4) "Rome"

}

Θα πρέπει να έχουμε υπόψη μας ότι οι συναρτήσεις ksort() και asort() δουλεύουν με αναφορά, δηλ. τροποποιούν απευθείας τις τιμές του πίνακα, και η τιμή επιστροφής τους είναι true ή false, ανάλογα με το αν η ταξινόμηση ήταν επιτυχής ή όχι. Υπάρχουν και οι συναρτήσεις arsort() και krsort() για αντίστροφη ταξινόμηση.

 

Διάβασμα Μόνο των Κλειδιών ή των Τιμών ενός Πίνακα

array array_keys ( array input [, mixed search_value [, bool strict]])

array array_values ( array input)

Οι συναρτήσεις array_keys() και array_values() επιστρέφουν έναν πίνακα με μόνο τα κλειδιά του (keys) η πρώτη και με μόνο τις τιμές του (values) η δεύτερη. Για παράδειγμα, αν έχουμε έναν πίνακα με τα IDs χρηστών για κλειδιά (keys) και με τα usernames για τιμές (values), θα μπορούμε να χρησιμοποιήσουμε τη συνάρτηση array_keys() για να δημιουργήσουμε έναν νέο πίνακα με τιμές τα κλειδιά του πρώτου πίνακα. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$users[100] = 'Florina';

$users[200] = 'Amyntaio';

$users[300] = 'Filotas';

$userids = array_keys($users);

var_dump($userids);

?>

Μετά την εκτέλεση του παραπάνω script, βλέπουμε ο πίνακας $userids θα περιέχει μόνο τα IDs των χρηστών :

array(3) {

[0]=> int(100)

[1]=> int(200)

[2]=> int(300)

}

Υπάρχουν δύο ακόμα παράμετροι που μπορούμε να μεταβιβάσουμε στη συνάρτηση array_keys(), μια τιμή για ταίριασμα (match) και αν θα γίνει αυστηρό ταίριασμα (strict matching). Με τις παραμέτρους αυτές μπορούμε να φιλτράρουμε τα κλειδιά του πίνακα, όπως για παράδειγμα αν δώσουμε την τιμή "tennis", τότε τα μόνα κλειδιά που η συνάρτηση array_keys() θα επιστρέψει είναι εκείνα που περιέχουν την τιμή "tennis".

Εξ ορισμού η σύγκριση γίνεται με τον τελεστή = =, αλλά αν δώσουμε την τιμή 1 στην τρίτη παράμετρο, ο έλεγχος θα γίνει με τον τελεστή === για ακριβές ταίριασμα. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$users[100] = 'Florina';

$users[200] = 'Amyntaio';

$users[300] = 'Filotas';

$userids = array_keys($users, "Florina");

var_dump($userids);

?>

Αυτή τη φορά, ο πίνακας $userids θα περιέχει ένα μόνο στοιχείο με την τιμή 100 καθώς το script φιλτράρει χρησιμοποιώντας το κείμενο "Florina", ως εξής :

array(1) {

[0]=> int(100)

}

Όσον αφορά τη συνάρτηση array_values(), η χρησιμότητά της μπορεί να μην είναι σαφής εξ αρχής καθώς φαίνεται ότι απλά αντιγράφει τις τιμές ενός πίνακα σ’ έναν καινούργιο πίνακα. Θα πρέπει να δούμε αρχικά το πώς δημιουργούνται οι αριθμητικοί πίνακες. Αν χρησιμοποιήσουμε τον τελεστή πίνακα [ ] για να εκχωρήσουμε τιμές σ’ έναν πίνακα, η PHP θα εκχωρήσει μόνη της τα κλειδιά 0, 1, 2 …

Αν μετά ταξινομήσουμε τον πίνακα με τη συνάρτηση asort(), η οποία αφήνει άθικτα τα κλειδιά του πίνακα, αυτά θα είναι μπερδεμένα καθώς η συνάρτηση asort() ταξινομεί με βάση τις τιμές (value) και όχι με βάση τα κλειδιά (key).

Η συνάρτηση array_values() αναγκάζει την PHP να δημιουργήσει έναν καινούργιο πίνακα όπου οι δείκτες (indexes) δημιουργούνται εκ νέου και οι τιμές αντιγράφονται από τον παλιό πίνακα. Το επόμενο script δείχνει τον τρόπο λειτουργίας της συνάρτησης array_values() :

<?php

$array[] = "Florina";

$array[] = "Kozani";

$array[] = "Edessa";

$array[] = "Beroia";

$array[] = "Grevena";

$array[] = "Kastoria";

var_dump($array);

asort($array);

var_dump($array);

var_dump(array_values($array));

?>

Η πρώτη εντολή var_dump() εκτυπώνει τον πίνακα με την αρχική του σύνθεση. Η δεύτερη εντολή εκτυπώνει τον πίνακα ταξινομημένο ως προς τις τιμές, ενώ τα κλειδιά είναι ανακατεμένα. Η τελευταία εντολή var_dump() χρησιμοποιεί τη συνάρτηση array_values() για να δημιουργήσει έναν καινούργιο πίνακα και τώρα τα κλειδιά είναι στη σωστή σειρά. Μετά την εκτέλεση του παραπάνω script, θα έχουμε το εξής αποτέλεσμα :

array(6) {

[0]=> string(7) "Florina"

[1]=> string(6) "Kozani"

[2]=> string(6) "Edessa"

[3]=> string(6) "Beroia"

[4]=> string(7) "Grevena"

[5]=> string(8) "Kastoria"

}

array(6) {

[3]=> string(6) "Beroia"

[2]=> string(6) "Edessa"

[0]=> string(7) "Florina"

[4]=> string(7) "Grevena"

[5]=> string(8) "Kastoria"

[1]=> string(6) "Kozani"

}

array(6) {

[0]=> string(6) "Beroia"

[1]=> string(6) "Edessa"

[2]=> string(7) "Florina"

[3]=> string(7) "Grevena"

[4]=> string(8) "Kastoria"

[5]=> string(6) "Kozani"

}

Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση array_values() όταν θέλουμε να επαναριθμήσουμε τους δείκτες (indexes) ενός πίνακα αλλά και όταν θέλουμε να μετατρέψουμε έναν συσχετιζόμενο πίνακα (associative array) που έχει strings για δείκτες (indexes) σ’ έναν απλό αριθμητικό πίνακα.

 

Αλλάζοντας Τυχαία τη Σειρά ενός Πίνακα

void shuffle ( array input)

mixed array_rand ( array input [, int num_req])

Πολύ συχνά βρισκόμαστε στην ανάγκη να μην διαβάσουμε έναν πίνακα με μια αυστηρή σειρά ταξινόμησης, οπότε θα χρειαστούμε τις συναρτήσεις shuffle() και array_rand(). Η συνάρτηση shuffle() ανακατεύει τυχαία τα στοιχεία ενός πίνακα. Ας δούμε το παρακάτω παράδειγμα :

<?php

$cities = array("Florina", "Kozani", "Kastoria", "Grevena");

shuffle($cities);

var_dump($cities);

?>

Με την εκτέλεση του παραπάνω script έχουμε το εξής αποτέλεσμα :

array(4) {

[0]=> string(7) "Florina"

[1]=> string(7) "Grevena"

[2]=> string(6) "Kozani"

[3]=> string(8) "Kastoria"

}

Ένα σημαντικό μειονέκτημα της συνάρτησης shuffle() είναι ότι ανακατεύει τα κλειδιά του πίνακα. Στην περίπτωση που θέλουμε απλά να πάρουμε μια τυχαία τιμή από έναν πίνακα, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση array_rand(). Το πλεονέκτημα αυτής της συνάρτησης είναι ότι αφήνει άθικτο τον αρχικό πίνακα.

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

<?php

$cities = array("Florina", "Kozani", "Kastoria", "Grevena");

var_dump(array_rand($cities, 2));

?>

Μετά την εκτέλεση του παραπάνω script, θα έχουμε το εξής αποτέλεσμα :

array(2) {

[0]=> int(0)

[1]=> int(1)

}

Βλέπουμε ότι η συνάρτηση array_rand() επιστρέφει τυχαία το κλειδί και όχι την τιμή ενός στοιχείου του πίνακα.

 

Η Συνάρτηση Range()

array range ( int low, int high [, int step])

Ας δούμε το εξής πρόβλημα :

Για να το κάνουμε αυτό σε PHP, μια προφανής λύση είναι ο εξής κώδικας :

<?php

$questions = array(1, 2, 3, 4, 5, ..., 38, 39, 40);

$questions = shuffle($questions);

?>

Ένας πιο έξυπνος κώδικας μπορεί να είναι ο εξής :

<?php

for ($i = 1; $i <= 40; ++$i) {

$questions[] = $i;

}

shuffle($questions);

?>

Προς τον σκοπό αυτό, η PHP διαθέτει τη συνάρτηση range() με την οποία μπορούμε να δημιουργήσουμε έναν πίνακα (array) από αριθμούς που να κυμαίνονται ανάμεσα σε μια χαμηλή τιμή (πρώτη παράμετρος) και σε μια υψηλή τιμή (δεύτερη παράμετρος). Έτσι, ο καλύτερος τρόπος για να γράψουμε το script είναι ο εξής :

<?php

$questions = range(1, 40);

$questions = shuffle($questions);

?>

Η συνάρτηση range() επιστρέφει έναν πίνακα με τις τιμές από το 1 έως και το 40 και μετά η συνάρτηση shuffle() ανακατεύει αυτούς τους αριθμούς. Η συνάρτηση range() διαθέτει και μια τρίτη παράμετρο με την οποία μπορούμε να ορίσουμε ένα βήμα (step), ως εξής :

$questions = range(1, 10, 2);

// επιστρέφει τους αριθμούς 1, 3, 5, 7, 9

$questions = range(1, 10, 3)

// επιστρέφει τους αριθμούς 1, 4, 7, 10

$questions = range(10, 100, 10);

// επιστρέφει τους αριθμούς 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

Στην περίπτωση που η πρώτη παράμετρος είναι μεγαλύτερη από τη δεύτερη παράμετρο, τότε έχουμε μείωση τιμών, ως εξής :

$questions = range(100, 0, 10);

// επιστρέφει τους αριθμούς 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0

Τέλος, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση range() για να δημιουργήσουμε πίνακες από χαρακτήρες, ως εξής :

$questions = range("a", "z", 1);

// επιστρέφει τους αριθμούς a, b, c, d, ..., x, y, z

$questions = range("z", "a", 2);

// επιστρέφει τους αριθμούς z, x, v, t, ..., f, d, b

 

Οι Πίνακες Πολλών Διαστάσεων

Μέχρι τώρα οι πίνακες που έχουμε δει ήταν μίας διάστασης (one-dimensional array). Όμως, σ’ έναν πίνακα δύο διαστάσεων (two-dimensional array), το κάθε στοιχείο περιέχει έναν πίνακα ως τιμή, όπως φαίνεται στο παρακάτω script :

<?php

$capitalcities['Imathia'] = array("Capital"=>"Beroia", "Population"=>150000, "NationalSport"=>"Football");

$capitalcities['Pella'] = array("Capital"=>"Edessa", "Population"=>170000, "NationalSport"=>"Volley");

$capitalcities['Pieria'] = array("Capital"=>"Katerini", "Population"=>80000, "NationalSport"=>"Basketball");

var_dump($capitalcities);

?>

Αυτή τη φορά δημιουργούμε τα στοιχεία του πίνακα $capitalcities όπως και πριν, αλλά χρησιμοποιούμε έναν πίνακα για την κάθε τιμή, όπου ο κάθε πίνακας-στοιχείο περιέχει τρία άλλα στοιχεία : Capital, Population και NationalSport. Το αποτέλεσμα από την εκτέλεση του παραπάνω script θα είναι το εξής :

array(3) {

["Imathia"]=> array(3) {

["Capital"]=> string(6) "Beroia"

["Population"]=> int(150000)

["NationalSport"]=> string(8) "Football"

}

["Pella"]=> array(3) {

["Capital"]=> string(6) "Edessa"

["Population"]=> int(170000)

["NationalSport"]=> string(6) "Volley"

}

["Pieria"]=> array(3) {

["Capital"]=> string(8) "Katerini"

["Population"]=> int(80000)

["NationalSport"]=> string(10) "Basketball"

}

}

 

Περιήγηση σ’ έναν Πίνακα

mixed reset ( array array)

mixed end ( array array)

mixed next ( array array)

mixed prev ( array array)

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

Με τη βοήθεια του δείκτη ενός πίνακα μπορούμε να γράψουμε κώδικα σαν τον εξής while (list($var, $val) = each($array)), όπου η συνάρτηση each μετακινεί τον δείκτη του πίνακα κάθε φορά που καλείται και μέχρι να φθάσει στο τέλος του πίνακα, οπότε επιστρέφει την τιμή false και ο βρόχος τερματίζει.

Ας δούμε το επόμενο κομμάτι κώδικα :

<?php

$array = array("Florina", "Amyntaio", "Filotas");

print "Πρώτη φορά \n";

while (list($var, $val) = each($array)) {

print "$var είναι $val\n";

}

print "Δεύτερη φορά …\n";

while (list($var, $val) = each($array)) {

print "$var είναι $val\n";

}

?>

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

Πρώτη φορά …

0 είναι Florina

1 είναι Amyntaio

2 είναι Filotas

Δεύτερη φορά …

Βλέπουμε ότι δεν εκτυπώνονται τα περιεχόμενα του πίνακα $array τη δεύτερη φορά και ο λόγος είναι ότι η συνάρτηση each() δεν μετακινεί τον δείκτη του πίνακα πίσω στο πρώτο στοιχείο όταν την καλούμε για πρώτη φορά αλλά απλά συνεχίζει από εκεί που έμεινε ο δρομέας. Έτσι, μετά από τον πρώτο βρόχο while, ο δρομέας (cursor) βρίσκεται στο άκρο δεξιά του πίνακα και όταν πάμε στον δεύτερο βρόχο while, η συνάρτηση each() επιστρέφει την τιμή false επειδή δείχνει στο τελευταίο στοιχείο του πίνακα.

Υπάρχουν τέσσερις συναρτήσεις για να ορίσουμε εμείς τη θέση του δρομέα μέσα στον πίνακα : η reset(), η end(), η next() και η prev(). Όλες δέχονται μία παράμετρο, τον πίνακα στον οποίο θέλουμε να μετακινηθούμε, και επιστρέφουν μια τιμή (value) από τον πίνακα. Η συνάρτηση reset() επαναφέρει τον δρομέα στο πρώτο στοιχείο και επιστρέφει την τιμή αυτού του στοιχείου, ενώ η συνάρτηση end() τοποθετεί τον δρομέα στο τελευταίο στοιχείο του πίνακα και επιστρέφει την τιμή αυτού του στοιχείου.

Οι συνάρτηση next() και prev() μετακινούν τον δρομέα μπροστά και πίσω κατά ένα στοιχείο αντίστοιχα και επιστρέφουν την τιμή του στοιχείου στο οποίο δείχνουν μετά τη μετακίνηση. Αν κάποια από τις συναρτήσεις αυτές δεν μπορέσει να επιστρέψει κάποια τιμή, όπως στην περίπτωση που δεν υπάρχουν στοιχεία στον πίνακα ή αν ο δρομέας έφθασε στο άκρο του πίνακα, τότε επιστρέφει την τιμή false.

Για παράδειγμα, για να περιηγηθούμε σ’ έναν πίνακα από το τέλος προς την αρχή (reverse), μπορούμε να χρησιμοποιήσουμε τον εξής κώδικα :

<?php

$array = array("Kozani", "Kastoria", "Grevena", "Florina");

print end($array);

while($val = prev($array)) {

print $val;

}

?>

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

FlorinaGrevenaKastoriaKozani

 

Κενά σε Πίνακες

Ας δούμε το παρακάτω script :

<?php

$array["a"] = "Kozani";

$array["b"] = "";

$array["c"] = "Grevena";

$array["d"] = "Florina";

print end($array);

while($val = prev($array)) {

print $val;

}

?>

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

FlorinaGrevena

Όπως βλέπουμε, είναι παρόμοιο με το προηγούμενο παράδειγμα και θα πρέπει να εμφανίσει τα στοιχεία του πίνακα με ανάποδη σειρά (reverse). Όμως, η τιμή στο κλειδί "b" είναι κενή (empty) και επειδή οι συναρτήσεις prev() και next() εκλαμβάνουν μια κενή τιμή ως ένδειξη ότι έχουμε φθάσει στο τέλος του πίνακα, επιστρέφουν την τιμή false και έτσι τελειώνει πρόωρα ο βρόχος while.

Για να αντιμετωπίσουμε αυτό το πρόβλημα, δεν έχουμε παρά να χρησιμοποιήσουμε τη συνάρτηση each(), ως εξής :

<?php

$array["a"] = "Kozani";

$array["b"] = "";

$array["c"] = "Grevena";

$array["d"] = "Florina";

while (list($var, $val) = each($array)) {

print "$var είναι $val\n";

}

?>

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

a είναι Kozani

b είναι

c είναι Grevena

d είναι Florina

 

Χρήση Πινάκων σε Strings

Αρκετά συχνά θέλουμε να χρησιμοποιήσουμε έναν πίνακα απευθείας μέσα σ’ ένα string, με κώδικα σαν τον εξής :

<?php

$myarray['f'] = "Florina";

print "Αυτό προέρχεται από έναν πίνακα : $myarray['f']\n";

?>

Δυστυχώς, ο παραπάνω κώδικας δεν θα κάνει δουλειά και αυτό γιατί η PHP θεωρεί το $myarray ως μια μεταβλητή (variable) και το ['f'] μέρος του πίνακα ως ένα κανονικό string που κολλάει στο τέλος της τιμής της μεταβλητής $myarray. Η λύση είναι να χρησιμοποιήσουμε τα σύμβολα { και } γύρω από τη μεταβλητή, ώστε να πούμε στην PHP ότι της μεταβιβάζουμε έναν πίνακα. Ακολουθεί ο σωστός κώδικας :

<?php

$myarray['f'] = "Florina";

print "Αυτό προέρχεται από έναν πίνακα : {$myarray['f']}\n";

?>

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

Αυτό προέρχεται από έναν πίνακα : Florina

 

Αποθήκευση Πινάκων

string serialize ( mixed value)

mixed unserialize ( string input)

string urlencode ( string text)

string urldecode ( string encoded)

Καθώς οι πίνακες είναι σύνθετοι τύποι δεδομένων (complex data types), δεν είμαστε σε θέση να δούμε απευθείας τα περιεχόμενά τους. Ευτυχώς που η PHP διαθέτει τέσσερις σχετικές συναρτήσεις : την serialize(), την unserialize(), την urlencode() και την urldecode(). Η συνάρτηση serialize() μετατρέπει έναν πίνακα, που είναι η μοναδική της παράμετρος, σ’ ένα κανονικό string που μπορούμε να αποθηκεύσουμε σ’ ένα αρχείο (file), να στείλουμε σ’ ένα URL κλπ. Η συνάρτηση unserialize() κάνει την ανάποδη δουλειά καθώς δέχεται ένα string που έχει γίνει serialize()d και το μετατρέπει ξανά σε πίνακα (array).

Οι συναρτήσεις urlencode() και urldecode() δουλεύουν επίσης αντίστοιχα και μετατρέπουν το string που τις μεταβιβάζεται ως την μοναδική τους παράμετρο σε μια μορφή που είναι ασφαλής για χρήση στο Web. Αυτό σημαίνει ότι όλοι οι χαρακτήρες που δεν είναι γράμματα και ψηφία μετατρέπονται σε ασφαλείς για το Web κωδικούς που μπορούν εύκολα να μετατραπούν στο αρχικό κείμενο με τη συνάρτηση urldecode(). Η μεταβίβαση πινάκων ανάμεσα σε ιστοσελίδες γίνεται καλύτερα με τις συναρτήσεις urlencode() και urldecode(), μπορούμε όμως να τις χρησιμοποιούμε σ’ όλα τα δεδομένα που μεταβιβάζουμε στο Web, απλά για να είμαστε σίγουροι ότι δεν υπάρχουν μη συμβατοί χαρακτήρες.

Ας δούμε το επόμενο script :

<?php

$array["a"] = "Florina";

$array["b"] = "Kozani";

$array["c"] = "Kastoria";

$array["d"] = "Grevena";

$str = serialize($array);

$strenc = urlencode($str);

print $str . "\n";

print $strenc . "\n";

?>

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

a:4:{s:1:"a";s:7:"Florina";s:1:"b";s:6:"Kozani";s:1:"c";s:8:"Kastoria";s:1:"d";s:7:"Grevena";} a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A7%3A%22Florina%22%3Bs%3A1%3A%22b%22%3Bs
%3A6%3A%22Kozani%22%3Bs%3A1%3A%22c%22%3Bs%3A8%3A%22Kastoria%22%3Bs%3A1%3A
%22d%22%3Bs%3A7%3A%22Grevena%22%3B%7D

Οι δύο πρώτες γραμμές περιέχουν την serialize()d έξοδο του πίνακα, ενώ οι επόμενες γραμμές περιέχουν τον urlencode()d serialize()d πίνακα, που μπορεί μεν να είναι δύσκολος στην ανάγνωσή του, είναι όμως πλήρως Web safe και συνεπώς είναι καλύτερο να τον χρησιμοποιούμε. Για να επιστρέψουμε στον αρχικό πίνακα, μπορούμε να χρησιμοποιήσουμε τον εξής κώδικα :

<?php

$arr = unserialize(urldecode($strenc));

var_dump($arr);

?>
 

back.gif (9867 bytes)

Επιστροφή