Forum und email

Arrays

Ένας array στην PHP είναι στην πραγματικότητα ένας ταξινομημένος χάρτης (map). Ένας χάρτης είναι ένας τύπος που αντιστοιχεί τις τιμές σε κλειδιά. Αυτός ο τύπος έχει βελτιστοποιηθεί με πολλούς τρόπους, έτσι ώστε να μπορείτε να τον χρησιμοποιήσετε σαν πραγματικό array, ή ως λίστα (vector), hashtable (το οποίο είναι μια υλοποίηση ενός map), ευρετήριο, συλλογή, στοίβα, ουρά και πιθανώς και άλλα. Επειδή μπορείτε να έχετε και άλλον PHP-array ως τιμή, μπορείτε επίσης σχετικά εύκολα να προσομοιώσετε δέντρα (trees).

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

Σύνταξη

Ορίζοντας array()

Ένας array μπορεί να δημιουργηθεί από τη γλωσσική δομή (language-construct) array(). Απαιτείται ένας ορισμένος αριθμός από key => ζεύγη τιμών που χωρίζονται με κόμματα.

array(  key =>  value
     , ...
     )
// key may be an integer or string
// value may be any value
      

<?php
$arr 
= array("foo" => "bar"12 => true);

echo 
$arr["foo"]; // bar
echo $arr[12];    // 1
?>

Ένα κλειδί (key) είναι είτε integer είτε string. Αν ένα key είναι η standard αναπαράσταση ενός integer, τότε θα ερμηνευθεί ως τέτοια (π.χ. το "8" θα ερμηνευθεί ως 8, ενώ το "08" θα ερμηνευθεί ως "08"). Δεν υπάρχουν διαφορετικοί indexed και associative τύποι από arrays στην PHP, υπάρχει μόνο ένας τύπος array, που μπορεί να περιέχει τόσο ακέραια όσο και string ευρετήρια.

Μια τιμή μπορεί να είναι οποιουδήποτε PHP τύπου.

<?php
$arr 
= array("somearray" => array(=> 513 => 9"a" => 42));

echo 
$arr["somearray"][6];    // 5
echo $arr["somearray"][13];   // 9
echo $arr["somearray"]["a"];  // 42
?>

Αν παραλέιψετε ένα κλειδί, το μέγιστο του ακέραιου-ευρετηρίου λαμβάνεται, και το νέο κλειδί θα είναι αυτό το μέγιστο + 1. Αν καθορίσετε ένα κλειδί που του έχει ήδη ανατεθεί μια τιμή, αυτή η τιμή θα επικαλυφθεί από τη νέα (overwritten).

<?php
// This array is the same as ...
array(=> 433256"b" => 12);

// ...this array
array(=> 43=> 32=> 56"b" => 12);
?>

Warning

Όσον αφορά την PHP 4.3.0, η συμπεριφορά παραγωγής του index που περιγράφηκε παραπάνω έχει αλλάξει. Τώρα, αν προσθέσετε σε έναν πίνακα του οποίου το τρέχον μέγιστο κλειδί είναι αρνητικό, τότε το επόμενο κλειδί που θα δημιουργηθεί θα είναι μηδέν (0). Παλιότερα, το καινούριο index θα είχε οριστεί στο μεγαλύτερο υπάρχον κλειδί + 1, όπως συμβαίνει και με τις θετικές τιμές.

Χρησιμοποιώντας το TRUE ως κλειδί θα υπολογιστεί ο ακέραιος 1 ως κλειδί. Χρησιμοποιώντας το FALSE ως κλειδί θα υπολογιστεί ο ακέραιος 0 ως κλειδί. Χρησιμοποιώντας το NULL ως κλειδί θα έχουμε ως αποτέλεσμα ένα κενό string. Χρησιμοποιώντας ένα κενό string ως κλειδί θα δημιουργηθεί (ή επανεγγραφεί) ένα κλειδί με ένα κενό string και η τιμή του δε θα είναι η ίδια με αυτή που θα είχαμε αν χρησιμοποιούσαμε κενές παρενθέσεις.

Δεν μπορείτε να χρησιμοποιήσετε arrays ή objects ως κλειδιά. Αν το κάνετε θα εμφανιστεί η προειδοποίηση: Illegal offset type.

Δημιουργώντας/Αλλάζοντας με την square-bracket σύνταξη

Μπορείτε επίσης να αλλάξετε έναν υπάρχον array, ορίζοντας ρητά τιμές σ'αυτόν.

Αυτό γίνεται αναθέτοντας τιμές στον array ενώ συγχρόνως καθορίζεται το κλειδί στις παρενθέσεις. Μπορείτε βέβαια να παραλήψετε το κλειδί και να προσθέσετε ένα κενό ζευγάρι από παρενθέσεις ("[]") στο όνομα της μεταβλητής στην περίπτωση αυτή.

$arr[key] = value;
$arr[] = value;
// key is either string or nonnegative integer
// value can be anything
      
Αν η $arr δεν υπάρχει ακόμη, θα δημιουργηθεί. Αυτός είναι ένας εναλλακτικός τρόπος για να καθορίσετε έναν array. Για να αλλάξετε μια συγκεκριμένη τιμή, απλά αναθέστε μια νέα τιμή σε ένα στοιχείο που ορίζεται με το κλειδί του. Αν θέλετε να αφαιρέσετε ένα ζευγάρι κλειδιού/τιμής, θα χρειαστεί να κάνετε unset() σ'αυτό.
<?php
$arr 
= array(=> 112 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42// This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>

Note: Όπως έχει προαναφερθεί, αν γράψετε τις παρανεθέσεις χωρίς να ορίσετε κάποιο κλειδί, τότε ο μέγιστος από τους υπάρχοντες ακεραίους λαμβάνεται, και το καινούριο κλειδί θα είναι αυτή η μέγιστη τιμή + 1 . Αν δεν υπάρχει κάποιος ακέραιος ακόμη, το κλειδί θα είναι 0 (μηδέν). Αν ορίσετε ένα κλειδί που έχει ήδη μια τιμή αυτή η τιμή θα γραφτεί από πάνω (overwritten).

Warning

Όσον αφορά την PHP 4.3.0, η συμπεριφορά παραγωγής του index που περιγράφηκε παραπάνω έχει αλλάξει. Τώρα, αν προσθέσετε σε έναν πίνακα του οποίου το τρέχον μέγιστο κλειδί είναι αρνητικό, τότε το επόμενο κλειδί που θα δημιουργηθεί θα είναι μηδέν (0). Παλιότερα, το καινούριο index θα είχε οριστεί στο μεγαλύτερο υπάρχον κλειδί + 1, όπως συμβαίνει και με τις θετικές τιμές.


Σημειώστε ότι το μέγιστο ακέραιο κλειδί που χρησιμοποιείται δεν χρειάζεται απαραιτήτως να υπάρχει στον πίνακα. Απλά πρέπει να υπήρχε στον πίνακα κάποια στιγμή από την τελευταία φορά που έγινε στον πίνακα αναταξινόμηση (re-index). Το ακόλουθο παράδειγμα δείχνει τα παραπάνω:
<?php
// Create a simple array.
$array = array(12345);
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 .

Note: Η συνάρτηση unset() σας επιτρέπει να κάνετε unset στα κλειδιά ενός array. Πρέπει να λάβετε υπόψη ότι ο array ΔΕΝ θα ξαναταξινομηθεί. Μόνο αν χρησιμοποιήσετε το "usual integer indices" (αρχίζοντας από το μηδέν, και αυξάνοντας κατά ένα), θα μπορέσετε να πετύχετε την αναταξινόμηση χρησιμοποιώντας την array_values().

<?php
$a 
= array(=> 'one'=> 'two'=> 'three');
unset(
$a[2]);
/* will produce an array that would have been defined as
   $a = array(1 => 'one', 3 => 'three');
   and NOT
   $a = array(1 => 'one', 2 =>'three');
*/

$b array_values($a);
// Now b is array(1 => 'one', 2 =>'three')
?>

Η δομή ελέγχου foreach υπάρχει ειδικά για τους arrays. Παρέχει έναν εύκολο τρόπο για να προσπελαύνετε έναν array.

Τι κάνουν και τι δεν κάνουν οι Arrays

Γιατί είναι η $foo[bar] λάθος?

Πρέπει πάντα να χρησιμοποιείτε εισαγωγικά έξω από ένα ευρετήριο ενός associative array. Για παράδειγμα, χρησιμοποιήστε την $foo['bar'] και όχι την $foo[bar]. Αλλά γιατί είναι η $foo[bar] λανθασμένη; Ίσως έχετε δει τον ακόλουθο τρόπο σύνταξης σε παλιότερα scripts:

<?php
$foo
[bar] = 'enemy';
echo 
$foo[bar];
// etc
?>
Αυτό είναι λάθος, αλλά δουλεύει. Τότε, γιατί είναι λάθος? Ο λόγος είναι ότι αυτός ο κώδικας έχει μια απροσδιόριστη σταθερά (την bar) παρά ένα string ('bar' - προσέξτε τα εισαγωγικά), και η PHP ίσως μελλοντικά ορίσει σταθερές οι οποίες, δυστυχώς για τον κώδικα σας, έχουν το ίδιο όνομα. Δουλεύει, επειδή η PHP αυτόματα μετατρέπει ένα bare string (είναι ένα string χωρίς εισαγωγικά που δεν αντιστοιχεί σε κάποιο γνωστό σύμβολο) σε string που περιέχει το bare string. Για παράδειγμα, αν δεν υπάρχει κάποιο ορισμένη σταθερά με το όνομα bar, τότε η PHP θα αντικαταστήσει το string 'bar' και θα χρησιμοποιεί αυτό.

Note: Αυτό δε σημαίνει να βάζετε πάνταalways εισαγωγικά στο κλειδί. Δεν θέλετε να βάζετε εισαγωγικά στα κλειδιά που είναι σταθερές ή μεταβλητές, καθώς αυτό θα εμποδίζει την PHP από το να τα μεταγλωττίσει.

<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('html_errors'false);
// Simple array:
$array = array(12);
$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
// Let's show all errors
error_reporting(E_ALL);

$arr = array('fruit' => 'apple''veggie' => 'carrot');

// Correct
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Incorrect.  This works but also throws a PHP error of
// level E_NOTICE because of an undefined constant named fruit
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// Let's define a constant to demonstrate what's going on.  We
// will assign value 'veggie' to a constant named fruit.
define('fruit''veggie');

// Notice the difference now
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// The following is okay as it's inside a string.  Constants are not
// looked for within strings so no E_NOTICE error here
print "Hello $arr[fruit]";      // Hello apple

// With one exception, braces surrounding arrays within strings
// allows constants to be looked for
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// This will not work, results in a parse error such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using autoglobals in strings as well
print "Hello $arr['fruit']";
print 
"Hello $_GET['foo']";

// Concatenation is another option
print "Hello " $arr['fruit']; // Hello apple
?>

Όταν ενεργοποιήσετε το error_reporting() να εμφανίζει E_NOTICE για level errors (όπως το να τεθεί στη σταθερά E_ALL) τότε θα δείτε αυτά τα λάθη. Η προκαθορισμένη ρύθμιση είναι, το error_reporting να μην έχει ενεργοποιημένη τη ρύθμιση για εμφάνιση τους.

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

<?php
echo $arr[somefunc($bar)];
?>
Αυτό είναι ένα παράδειγμα χρήσης μιας συνάρτησης που επιστρέφει κάποια τιμή ως δείκτη πίνακα (array index). Η PHP επίσης γνωρίζει τις σταθερές, όπως θα έχετε δει E_* και προηγουμένως.
<?php
$error_descriptions
[E_ERROR]   = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>
Σημειώστε ότι η E_ERROR είναι επίσης ένας έγκυρος identifier, όπως η bar στο πρώτο παράδειγμα. Αλλά το τελευταίο παράδειγμα είναι στην πραγματικότητα το ίδιο με το να γράφαμε:
<?php
$error_descriptions
[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
επειδή η E_ERROR ισούται με 1, κτλ.

Όπως έχουμε ήδη εξηγήσει σε προηγούμενα παραδείγματα, η $foo[bar] δουλεύει ακόμη αλλά είναι λάθος. Δουλεύει, επειδή bar εξαιτίας της σύνταξης της αναμένεται να είναι μια σταθερή έκφραση. Πάντως, σ'αυτή την περίπτωση καμία σταθερά με το όνομα bar δεν υπάρχει. Η PHP τώρα υποθέτει ότι εννοούσατε την bar κυριολεκτικά, όπως το string "bar", αλλά έχετε ξεχάσει να γράψετε τα εισαγωγικά.

Τότε γιατί είναι κακή;

Σε κάποια στιγμή στο μέλλον, η ομάδα της PHP ίσως θελήσει να προσθέσει και κάποια άλλη σταθερά ή keyword, ή μπορεί εσείς να θέλετε να εισάγετε κάποια σταθερά στην εφαρμογή σας, και τότε να αντιμετωπίσετε πρόβλημα. Για παράδειγμα, δεν μπορείτε ήδη να χρησιμοποιήσετε τις λέξεις empty και default μ'αυτόν τον τρόπο, αφού είναι ιδιαίτερες δεσμευμένες λέξεις.

Note: Για επανάληψη, μέσα σε ένα string με διπλα εισαγωγικά, είναι έγκυρο να μην περιλαμβάνετε array indexes με εισαγωγικά, συνεπώς το "$foo[bar]" είναι έγκυρο. Δείτε τα παραπάνω παραδείγματα για λεπτομέρειες σχετικά με το γιατί όπως επίσης το τμήμα σχετικά με το πέρασμα μεταβλητών σε strings.

Μετατρέποντας σε array

Για οποιοδήποτε από τους τύπους: integer, float, string, boolean και resource, αν μετατρέψετε μια τιμή σε array, παίρνετε έναν array με ένα στοιχείο (με index 0), το οποίο είναι η βαθμωτή τιμή με την οποία αρχίσατε.

Αν μετατρέψετε ένα object σε έναν array, παίρνετε τις ιδιότητες (μεταβλητές μελών) αυτού του αντικειμένου ως στοιχεία του array. Τα κλειδιά είναι τα ονόματα των μεταβλητών μελών.

Αν μετατρέψετε μια NULL τιμή σε array, παίρνετε έναν κενό array.

Παραδείγματα

Ο τύπος array στην PHP είναι πολύ ευπροσάρμοστος, έτσι εδώ θα δείτε μερικά παραδείγματα που θα σας δείξουν τις πολλές δυνατότητες των arrays.

<?php
// this
$a = array( 'color' => 'red',
            
'taste' => 'sweet',
            
'shape' => 'round',
            
'name'  => 'apple',
                       
4        // key will be 0
          
);

// is completely equivalent with
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // key will be 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),
// or simply array('a', 'b', 'c')
?>

Example#1 Χρησιμοποιώντας την array()

<?php
// Array as (property-)map
$map = array( 'version'    => 4,
              
'OS'         => 'Linux',
              
'lang'       => 'english',
              
'short_tags' => true
            
);
            
// strictly numerical keys
$array = array( 7,
                
8,
                
0,
                
156,
                -
10
              
);
// this is the same as array(0 => 7, 1 => 8, ...)

$switching = array(         10// key = 0
                    
5    =>  6,
                    
3    =>  7
                    
'a'  =>  4,
                            
11// key = 6 (maximum of integer-indices was 5)
                    
'8'  =>  2// key = 8 (integer!)
                    
'02' => 77// key = '02'
                    
0    => 12  // the value 10 will be overwritten by 12
                  
);
                  
// empty array
$empty = array();         
?>

Example#2 Collection (Συλλογή)

<?php
$colors 
= array('red''blue''green''yellow');

foreach (
$colors as $color) {
    echo 
"Do you like $color?\n";
}

/* output:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
*/
?>

Σημειώστε ότι προς το παρόν δεν είναι δυνατό να αλλάξουμε τις τιμές του array άμεσα σε ένα τέτοιο loop. Δείτε το ακόλουθο:

Example#3 Collection

<?php
foreach ($colors as $key => $color) {
    
// won't work:
    //$color = strtoupper($color);
    
    // works:
    
$colors[$key] = strtoupper($color);
}
print_r($colors);

/* output:
Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)
*/
?>

Αυτό το παράδειγμα δημιουργεί έναν one-based array.

Example#4 One-based index

<?php
$firstquarter  
= array(=> 'January''February''March');
print_r($firstquarter);

/* output:
Array 
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)
*/

Example#5 Γεμίζοντας έναν array

// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle); 
?>

Οι arrays είναι διατεταγμένοι. Μπορείτε επίσης να αλλάξετε τη σειρά χρησιμοποιώντας διάφορες συναρτήσεις ταξινόμησης. Δείτε το τμήμα συναρτήσεις για arrays για περισσότερες πληροφορίες. Μπορείτε να μετρήσετε τον αριθμό των στοιχείων σε ένα array χρησιμοποιώντας τη συνάρτηση count() .

Example#6 Array ταξινόμησης

<?php
sort
($files);
print_r($files);
?>

Επειδή η τιμή ενός array μπορεί να είναι οτιδήποτε, μπορεί επίσης να είναι ένας άλλος array. Μ'αυτόν τον τρόπο μπορείτε να κάνετε αναδρομικούς και πολυδιάστατους arrays.

Example#7 Αναδρομικοι και πολυδιάστατοι arrays

<?php
$fruits 
= array ( "fruits"  => array ( "a" => "orange",
                                       
"b" => "banana",
                                       
"c" => "apple"
                                     
),
                  
"numbers" => array ( 1,
                                       
2,
                                       
3,
                                       
4,
                                       
5,
                                       
6,
                                     ),
                  
"holes"   => array (      "first",
                                       
=> "second",
                                            
"third"
                                     
)
                );

// Some examples to address values in the array above 
echo $fruits["holes"][5];    // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]);  // remove "first"

// Create a new multi-dimensional array
$juices["apple"]["green"] = "good"
?>

Πρέπει να προσέχετε επειδή οι αναθέσεις των array πάντα εμπλέκουν αντιγραφή τιμών. Θα χρειαστεί να χρησιμοποιήσετε τον τελεστή αναφοράς για να αντιγράψετε έναν array με αναφορά.

<?php
$arr1 
= array(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 is changed,
             // $arr1 is still array(2, 3)
             
$arr3 = &$arr1;
$arr3[] = 4// now $arr1 and $arr3 are the same
?>