Η επεξεργασία ενός πίνακα είναι ένα αναπόσπαστο κομμάτι του προγραμματισμού καθώς με αυτόν τον τρόπο μπορούμε να επιλύσουμε την σύντομη επεξεργασία τεράστιων όγκων δεδομένων. Στις επόμενες υπό-ενότητες θα δούμε πως μπορούμε να επεξεργαστούμε έναν πίνακα αλλάζοντας το περιεχόμενο ή την δομή του.

Προσθήκη νέων στοιχείων

Υπάρχουν δυο τρόποι για να εισάγουμε ένα νέο στοιχείο σε έναν πίνακα. Ο πρώτος είναι απλά να καλέσουμε την θέση με το κλειδί στην οποία θέλουμε να προσθέσουμε το στοιχείο και να της αποδώσουμε μια τιμή.

<?php
 $pinakas[10] = "Τετάρτη";
 $pinakas[20] = "Σαββάτο";
 var_dump($pinakas);
?>

Ή εναλλακτικά με την χρήση μη αριθμημένων πινάκων.

<?php
 $pinakas["Νοέμβριος"] = 3000;
 $pinakas["Δεκέμβριος"] = 4000;
 var_dump($pinakas);
?>

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

Ο δεύτερος τρόπος εισαγωγής, γίνεται στο τέλος ενός πίνακά. Για να είναι δυνατή όμως αυτή η εισαγωγή θα πρέπει πρώτα ο πίνακας να υπάρχει από πριν. Σε περίπτωση που δεν υπάρχει δημιουργείται εκείνη την στιγμή αριθμημένος πίνακας με πρώτο κλειδί το «0».

<?php
 $paiktes = array(
  "Τερματοφύλακας"=>"Παπαστεργίου",
  "Δεξί μπακ"=>"Παπαδόπουλος");
 $paiktes[] = "Σαμαράς"; //εισαγωγή στο τέλους ήδη υπάρχον

 var_dump($paiktes);

 $imeres[]="Δευτέρα"; //δημιουργία νέου πίνακα
 var_dump($imeres);
?>

Παρά που ο πίνακας είναι μη αριθμημένος, το κλειδί που χρησιμοποιείται για τις νεοεισερχόμενες τιμές είναι αριθμός και συγκεκριμένα ο πρώτος διαθέσιμος δηλαδή το «0». Αν επιχειρήσουμε να προσθέσουμε μια τιμή μέσα σε έναν αριθμημένο πίνακα, τότε η νέα τιμή θα προστεθεί στην επόμενη κατά σειρά θέση όπου το κλειδί θα το επιτρέπει.

<?php
 $omada = array("Κωνσταντίνος","Ευάγγελος");
 $omada[] = "Ιωάννης";
 
 var_dump($omada);
?>

Διαγραφή και εισαγωγή

Η εντολή array_splice() μας δίνει την δυνατότητα τόσο της διαγραφής στοιχείων όσο και της εισαγωγής σε έναν πίνακα καθώς επίσης και της δημιουργίας νέου πίνακα με τα διαγραμμένα στοιχεία. Παίρνει 4 παραμέτρους (1 προαιρετική) :

  1. Έναν πίνακα στον οποίο επιδρούμε,
  2. Έναν ακέραιο αριθμό ως σημείο εκκίνησης μέσα στον πίνακα, το οποίο συμβολίζει το σημείο από όπου θα ξεκινήσουμε να επηρεάζουμε τα στοιχεία. Αν πρόκειται για διαγραφή τότε είναι το σημείο στο οποίο θα ξεκινήσουμε να διαγράφουμε στοιχεία, αν πρόκειται για εισαγωγή τότε είναι το σημείο στο οποίο θα ξεκινήσουμε να εισάγουμε στοιχεία,
  3. Έναν ακέραιο αριθμό, ο οποίος συμβολίζει το μήκος από το σημείο εκκίνησης και ύστερα στο οποίο θα επιδράσει η αλλαγή μας,
  4. Μόνο σε περίπτωση εισαγωγής, ένας πίνακας με τα στοιχεία που επιθυμούμε να εισάγουμε.

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

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

<?php
 $mathimata = array("Φυσική","Χημεία","Μαθηματικά","Ιστορία","Έκθεση");
 $diegramenos = array_splice($mathimata,1,3);
 
 var_dump($mathimata);
?>

Μπορούμε αν θέλουμε να δηλώσουμε μόνο έναν αριθμό ως όρισμα μαζί με τον πίνακα στην εκτέλεση της array_splice(). Αυτό θα διαγράψει όσα στοιχεία βρίσκονται από το σημείο που του υποδείξαμε ως το τέλος του πίνακα, έτσι αν του δώσουμε 2 τα στοιχεία «Μαθηματικά», «Ιστορία», «Έκθεση» θα διαγραφούν από τον πίνακα.

<?php
 $mathimata = array("Φυσική","Χημεία","Μαθηματικά","Ιστορία","Έκθεση");
 $diegramenos = array_splice($mathimata,2);
 
 var_dump($mathimata);
?>

Για να εισάγουμε στοιχεία απλά χρησιμοποιούμε την εντολή με 4 παραμέτρους όπως εξηγήθηκαν παραπάνω.

<?php
 $mathimata = array("Φυσική","Χημεία","Μαθηματικά","Ιστορία","Έκθεση" );
 $nea=array("Στατιστική","Γυμναστική");
 $diegramenos = array_splice($mathimata,4,2,$nea);
 
 var_dump($mathimata);
?>

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

Αν θέλουμε κατά την διάρκεια της εισαγωγής να μην διαγραφούν στοιχεία, και τα υπάρχων που έρχονται σε «σύγκρουση» να μετακινηθούν προς τα δεξιά. Τότε εισάγουμε σημείο εκκίνησης στις παραμέτρους αλλά στο μήκος εισάγουμε τιμή «0». Με αυτή την διαδικασία οι θέσεις οι οποίες δεν έχουν κάποιες τιμές διαγράφονται ενώ αυτές που ήδη έχουν τιμές πριν την εισαγωγή διατηρούνται.

<?php
 $mathimata = array("Φυσική","Χημεία","Μαθηματικά","Ιστορία","Έκθεση" );
 $nea=array("Στατιστική","Γυμναστική");
 $diegramenos = array_splice($mathimata,4,0,$nea);
 
 var_dump($mathimata);
?>

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

<?php
 $mathimata = array(
  "Μάθημα1" => "Φυσική",
  "Μάθημα2" => "Χημεία",
  "Μάθημα3" => "Μαθηματικά",
  "Μάθημα4" => "Ιστορία",
  "Μάθημα5" => "Έκθεση" );
 $nea=array("Στατιστική","Γυμναστική");
 $diegramenos = array_splice($mathimata,4,0,$nea);
 
 var_dump($mathimata);
?>

Αντιστροφή

Στην php μπορούμε την σειρά των στοιχείων ενός πίνακα να την αλλάξουμε σε ακριβώς την αντίθετη από ότι είναι. Αυτό επιτυγχάνεται με την εντολή «array_reverse()», η οποία παίρνει ως είσοδο μια παράμετρο, τον πίνακα που θέλουμε να αντιστρέψουμε. Αν εισάγουμε έναν αριθμημένο πίνακα τότε τα αριθμητικά κλειδιά ξανά παίρνουν αριθμούς από την αρχή ξεκινώντας από το 0, έτσι μια τιμή που ήταν τελευταία και είχε πχ. κλειδί 10 με την αντιστροφή θα έχει κλειδί 0. Αν εισάγουμε μη αριθμημένο πίνακα τότε τα αλφαριθμητικά κλειδιά μένουν ανεπηρέαστα.

<?php
 //Αριθμημένος πίνακας
 $numbered = array("Κώστας","Τάκης","Νίκος");
 $reversed = array_reverse($numbered);
 var_dump($reversed);
 echo "<br/>";
 
 //Μη αριθμημένος πίνακας
 $unumbered = array(
   'Λαχανικό' => 'Ντομάτα',
   'Φρούτο'   => 'Φράουλα');
 $reversed = array_reverse($unumbered);
 var_dump($reversed);
?>

Εκτός από την αντίστροφη σειρά των στοιχείων υπάρχει και η αντιστροφή μεταξύ τιμών και κλειδιών. Δηλαδή η τιμή μιας θέσης να γίνει το κλειδί της ενώ το κλειδί της να γίνει η τιμή της. Τα στοιχεία τα οποία οι τιμές τους δεν είναι ούτε αλφαριθμητικά αλλά ούτε ακέραιοι αριθμοί, παραμένουν ως έχουν στο νέο αποτέλεσμα. Απαραίτητη προϋπόθεση για να λειτουργήσει σωστά είναι κάθε τιμή που υπάρχει σε έναν πίνακα να είναι μοναδική σε σχέση με όλες τις άλλες τιμές, διότι κατά την αλλαγή σε κλειδί , δεν μπορούν να υπάρχουν διπλότυπα κλειδιά. Αυτού του είδους η αντιστροφή επιτυγχάνεται με την array_flip(), η οποία δέχεται ένα όρισμα (έναν πίνακα), και επιστρέφει το αποτέλεσμα τις μετατροπής, δεν επηρεάζει το ίδιον τον πίνακα που εισάγαμε σε αυτήν.

<?php
 //Αριθμημένος πίνακας
 $numbered = array("Κώστας","Τάκης","Νίκος");
 $fliped = array_flip($numbered);
 echo "<pre>";
 var_dump($fliped);
 echo "</pre>";
 
 //Μη αριθμημένος πίνακας
 $unumbered = array(
   'Λαχανικό' => 'Ντομάτα',
   'Φρούτο'   => 'Φράουλα');
 $fliped = array_flip($unumbered);
 echo "<pre>";
 var_dump($fliped);
 echo "</pre>";
?>

Τυχαία σειρά

Παρόμοια με την αντιστροφή πίνακα και την αντιστροφή κλειδιών-τιμών, μπορεί να υπάρξει και η εντελώς τυχαία σειρά των στοιχείων ενός πίνακα. Αυτό γίνεται με την εντολή «shuffle()» ή οποία δέχεται έναν πίνακα ως παράμετρο εισόδου στον οποίο και επιδρά. Αλλάζει τα στοιχεία σε μια τυχαία εντελώς σειρά από ότι είναι. Αντικαθιστά οποιοδήποτε κλειδί υπάρχει, με αριθμούς ξεκινώντας από το 0.

<?php 
 //Αριθμημένος πίνακας
 $numbered = array(
   "Δευτέρα","Τρίτη",
   "Τετάρτη","Πέμπτη",
   "Παρασκευή","Σαββάτο",
   "Κυριακή");
 shuffle($numbered);
 echo "<pre>";
 var_dump($numbered);
 echo "</pre>";
 
 //Μη αριθμημένος πίνακας
 $unumbered = array(
   'Λαχανικό' => 'Ντομάτα',
   'Φρούτο'   => 'Φράουλα',
   'Γλυκαντικό' => 'Ζάχαρη');
 shuffle($unumbered);
 echo "<pre>";
 var_dump($unumbered);
 echo "</pre>";
?>

Μετά την χρήση της shuffle είναι λογικό η σειρά πλέον να μην είναι ίδια όπως στο αποτέλεσμα μας καθότι εδώ χρησιμοποιούμε τυχαιότητα.

Μεταβλητές και πίνακες

Μια από τις πιο πολυσυζητημένες ικανότητες της php σε σύγκριση με ότι έχει να κάνει με έναν πίνακα είναι οι σχέσεις των πινάκων μεταξύ μεταβλητών και πως αυτά τα δυο μπορούν να αλληλεπιδράσουν αρμονικά τόσο για την εισαγωγή στοιχείων από μεταβλητές σε πίνακα όσο και την εξαγωγή μεταβλητών από τιμές πινάκων.

list()

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

<?php 
 $epafi = array("Κώστας",24,2101234567);
 list($onoma,$ilikia,$tilefono) = $epafi;
 echo $onoma."<br/>".$ilikia."<br/>".$tilefono;
?>

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

<?php 
 $epafi = array("Κώστας",24,2101234567);
 list($onoma,$ilikia) = $epafi;
 echo $onoma."<br/>".$ilikia;
?>

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

<?php 
 $epafi = array("Κώστας",24,2101234567);
 list($onoma,$ilikia,$tilefono,$odos) = $epafi;
 echo $onoma."<br/>".$ilikia."<br/>".$tilefono;
?>

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

<?php 
 $epafi = array("Κώστας",24,2101234567);
 list($onoma,,$tilefono) = $epafi;
 echo $onoma."<br/>".$tilefono;
?>

extract()

Η εντολή extract() δημιουργεί μεταβλητές βασιζόμενη σε έναν μοναδικό μη αριθμημένο πίνακα με κλειδιά. Παίρνει τρία ορίσματα:

  1. Έναν πίνακα από τον οποίο θα εξάγουμε τιμές,
  2. Μία τιμή η οποία δηλώνει πως θα συμπεριφερθεί η εντολή (δείτε τον παρακάτω πίνακα).
  3. Ένα αλφαριθμητικό που συμβολίζει ένα πρόθεμα.

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

Οι εντολές που μπορεί να πάρει το δεύτερο όρισμα είναι οι εξής:

  • EXTR_OVERWRITE
    Αν υπάρχει σύγκρουση, τότε η ήδη υπάρχουσα μεταβλητή διαγράφεται και ισχύει η καινούργια.
  • EXTR_SKIP
    Αν υπάρχει σύγκρουση, δεν διαγράφεται η ήδη υπάρχουσα μεταβλητή.
  • EXTR_PREFIX_SAME
    Αν υπάρχει σύγκρουση, τότε δημιουργείται η νέα μεταβλητή με πρόθεμα την τιμή από το τρίτο όρισμα.
  • EXTR_PREFIX_ALL
    Όλες οι νέες μεταβλητές δημιουργούνται με πρόθεμα το τρίτο όρισμα.
  • EXTR_PREFIX_INVALID
    Πρόσθεσε πρόθεμα μόνο στις μεταβλητές που έχουν λανθασμένο όνομα.
  • EXTR_IF_EXISTS
    Αντικαθίστανται οι μεταβλητές μόνο εφόσον υπάρχουν ήδη.
  • EXTR_PREFIX_IF_EXISTS
    Δημιουργούνται μεταβλητές με πρόθεμα μόνο εάν οι εκδόσεις των αντίστοιχων μεταβλητών χωρίς πρόθεμα υπάρχουν ήδη.
  • EXTR_REFS
    Εξαγωγή μεταβλητών ως αναφορές. Αυτό σημαίνει ότι όλες οι μεταβλητές που θα δημιουργηθούν θα συνεχίζουν να είναι αναφορές προς τον πίνακα από όπου προκύψαν, κι αν αλλάξει το περιεχόμενο του αυτόματα αλλάζει και το περιεχόμενο των μεταβλητών.
<?php
 $Μάθημα1 = "Προγραμματισμός";
 $mathimata = array(
  "Μάθημα1" => "Φυσική",
  "Μάθημα2" => "Χημεία",
  "Μάθημα3" => "Μαθηματικά",
  "Μάθημα4" => "Ιστορία",
  "Μάθημα5" => "Έκθεση" );
 
 extract($mathimata,EXTR_PREFIX_ALL,"νέο");
 
 echo $Μάθημα1."<br>";
 echo $νέο_Μάθημα1."<br>";
 echo $νέο_Μάθημα2;

?>

compact()

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

<?php 
 $onoma = "Κώστας";
 $ilikia = 24;
 $tilefono = 2101234567;

 $pinakas = compact("onoma","ilikia","tilefono");

 echo "<pre>";
 print_r($pinakas);
 echo "</pre>";
?>