Re: fmouse,
the phenomenom you're describing pertains to superglobals, not arrays, and it only applies in a very specific scope. Check out http://de.php.net/manual/en/language.variables.variable.php :
"Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically."
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(6 => 5, 13 => 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(5 => 43, 32, 56, "b" => 12);
// ...this array
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
Όσον αφορά την 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(5 => 1, 12 => 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(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 .
Note: Η συνάρτηση unset() σας επιτρέπει να κάνετε unset στα κλειδιά ενός array. Πρέπει να λάβετε υπόψη ότι ο array ΔΕΝ θα ξαναταξινομηθεί. Μόνο αν χρησιμοποιήσετε το "usual integer indices" (αρχίζοντας από το μηδέν, και αυξάνοντας κατά ένα), θα μπορέσετε να πετύχετε την αναταξινόμηση χρησιμοποιώντας την array_values().
<?php
$a = array(1 => 'one', 2 => 'two', 3 => '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
?>
Note: Αυτό δε σημαίνει να βάζετε πάντα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
// 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)];
?>
<?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";
?>
<?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";
?>
Όπως έχουμε ήδη εξηγήσει σε προηγούμενα παραδείγματα, η $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(1 => '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",
5 => "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(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
// $arr1 is still array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
Arrays
13-Sep-2008 08:49
04-Jun-2008 04:43
>fmouse
Variable variables can be used with arrays as discussed in the variable variable section.
Also, from your code, $somevar can be an array and still work fine.
$fum = "somevar";
$$fum = array(); // $somevar is now an array
$foo = $$fum;
print_r( $foo); // we get an empty array printed
print_r() doesn't just print arrays, it prints any variable type.
If you pass it a variable, that hasn't been defined yet, it won't know how to print it.
You would get this same results by passing any undefined variable such as:
print_r( $bar ); // PHP Notice: undefined variable ...$bar
29-Apr-2008 01:14
Using variables as array names no longer works in PHP5.
$fum = "somevar";
$foo = $$fum;
# Still works if $somevar isn't an array. $foo contains the value of $somevar
but ....
$fum = "_POST";
print_r($$fum);
print_r(${$fum});
Neither form of indirection works in this context. $$fum comes back empty.
If you have PHP4 code that used this kind of indirection you can work around the change in PHP5 using an eval().
$fum = "_POST";
$foo = eval("return $$fum;");
print_r($foo);
This works!
18-Mar-2008 02:52
Sorting double dimensional arrays by a specified key bothe for Strings and for integers:
Ex:
$personDetails = array( array("firstName" => "Nancy", "lastName" => "Grace", "age" => 22), array("firstName" => "Andy", "lastName" => "Peter", "age" => 28), array("firstName" => "Jim", "lastName" => "Gary", "age" => 25), array("firstName" => "Lary", "lastName" => "James", "age" => 28), array("firstName" => "Peter", "lastName" => "David", "age" => 17), array("firstName" => "Raj", "lastName" => "King", "age" => 9), array("firstName" => "John", "lastName" => "Baxter","age" => 35) );
//To sort the array by firstName:-
function sortFirstName($p1, $p2) {
return strnatcmp($p1['firstName'], $p2['firstName']);
}
usort($personDetails, 'sortFirstName');
//To sort by an integer Field
function sortByInteger(&$personDetails, $field) {
$sort = "return strnatcmp(\$p1['$field'], \$p2['$field']);";
usort($personDetails, create_function('$p1,$p2', $sort));
return $personDetails;
}
$personDetails = sortByInteger($personDetails, 'age');
//To sort the array in Descending order by a key, It can be done by adding "-" sign before strnatcmp() function.
I hope this helps
09-Jan-2008 08:00
"If you convert a NULL value to an array, you get an empty array."
This turns out to be a useful property. Say you have a search function that returns an array of values on success or NULL if nothing found.
$values = search(...);
Now you want to merge the array with another array. What do we do if $values is NULL? No problem:
$combined = array_merge((array)$values, $other);
Voila.
18-Dec-2007 04:25
z on 22-Apr-2005 12:10 wrote:
-----------------------------------------------
Here's a simple function to insert a value into some position in an array
<?php
function array_insert($array,$pos,$val)
{
$array2 = array_splice($array,$pos);
$array[] = $val;
$array = array_merge($array,$array2);
return $array;
}
?>
and now for example...
<?php
$a = array("John","Paul","Peter");
$a = array_insert($a,1,"Mike");
?>
Now $a will be "John","Mike","Paul","Peter"
-----------------------------------------------
Im learning to use PHP and reading about array_splice found that
<?php
function array_insert($array,$pos,$val)
{
$array2 = array_splice($array,$pos);
$array[] = $val;
$array = array_merge($array,$array2);
return $array;
}
$a = array("John","Paul","Peter");
$a = array_insert($a,1,"Mike");
print_r($a);
?>
would output the same as
<?php
$b = array("John","Paul","Peter");
array_splice($b,1,0,array("Mike"));
print_r($b);
?>
10-Oct-2007 02:14
<?php
//Simple Login Script using associative array.
//You may modify the codes and use $_POST['FORM_FIELD_DATA'] for your web-page.
//You may spice-up the codes with more form field validation & security features.
//$user_name=$_POST['user_name'];
//$password=$_POST['password'];
$test_user_name = 'michelle_smith'; //for testing purpose only
$test_password = 'msmith321'; //for testing purpose only
$user_name = $test_user_name;
$password = $test_password;
// here user_name is key and password is the value of an array..
// website owner has to add new user/site member manually in $login_array
$login_array = array(
'user_name' => 'password',
'alex_duff' => 'alx321',
'xena78' => 'xena321',
'dela_pena' => 'delp321',
'shawn_1981' => 'shw81',
'michelle_smith' => 'msmith321');
ksort ($login_array);
reset($login_array);
if (isset($login_array[$user_name]))
{
$pass_check = $login_array[$user_name];
if ($password === $pass_check)
{
echo "Welcome, $user_name!\n<br>"; //may redirect to specific webpage.
}
else
{
echo "Please try again!"; //may redirect to Error page.
}
}
else
{
echo "Please register with us. Thanks!"; //may redirect to registration page.
exit();
}
echo("\n<br>");
echo 'Thanks to Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski for wonderful PHP!';
?>
06-Sep-2007 11:36
Its worth noting that there does not appear to be any functional limitations on the length or content of string indexes. The string indexes for your arrays can contain any characters, including new line characters, and can be of any length:
<?php
$key = "XXXXX";
$test = array($key => "test5");
for ($x = 0; $x < 500; $x++) {
$key .= "X";
$value = "test" . strlen($key);
$test[$key] = $value;
}
echo "<pre>";
print_r($test);
echo "</pre>";
?>
Keep in mind that using extremely long array indexes is not a good practice and could cost you lots of extra CPU time. However, if you have to use a long string as an array index you won't have to worry about the length or content.
30-Aug-2007 01:56
<?php
//EXAMPLE of Multi-Dimentional Array where as an array's keys are an array itself.
//It's so easy to create one like this.
$movie_to_watch = array ('Action'=>
array('Kanu Reeves' => 'Matrix Reloaded',
'Pearce Brosnan' => 'Die Another Day',
'Tom Cruz' => 'Mission Impossible',
'Jason Statham' => 'Crank',
'Danzel Washington' => 'Man on Fire'),
'Comedy' =>
array ('Charlie Chaplin' => 'City Lights',
'Jim Carrey' => 'Cable Guy',
'Rowan Atkinson' => 'The Ultimate Disaster'));
$type_wanted = 'Action'; //You may switch type from Action to Comedy.
$hero_wanted = 'Pearce Brosnan'; // You may switch hero from Pearce Brosnan to Jim Carrey.
print ("$hero_wanted 's $type_wanted movie is " . $movie_to_watch[$type_wanted][$hero_wanted].".");
// produces browser output as under:
// Pearce Brosnan 's Action movie is Die Another Day.
?>
21-Aug-2007 02:59
Hey..
here is a function which helps to avoid using empty/isset
checkings for arrays.
(it's acts simillar to 'default' modifier in Smarty)
Using this function you will avoid 'Undefined index' or
'Undefined offset' error.
<?php
$_POST['id']['other'] = 'val1';
/*
key exist (same as $_POST['id'][other])
*/
echo getRequestParam('id[other]', 'default value');
/*
key doesn't exist, we get default value (same as $_POST['var'])
*/
echo getRequestParam('var', 'default value');
function getRequestParam( $var, $default = '', $method = 'post' )
{
preg_match_all('!(\w+)!i',$var, $match );
array_shift($match);
$_vars = $match[0];
$ret = null;
if( strtoupper($method) == 'POST' ) {
$ret = _findRequestParam($_vars, $_POST);
}
elseif( strtoupper($method) == 'GET' ) {
$ret = _findRequestParam($_vars, $_GET);
}
elseif( strtoupper($method) == 'COOKIE' ) {
$ret = _findRequestParam($_vars, $_COOKIE);
}
elseif( strtoupper($method) == 'SESSION' ) {
$ret = _findRequestParam($_vars, $_SESSION);
}
if (! $ret )
return $default;
else
return $ret;
}
/**
@access private
*/
function _findRequestParam($vars, $find_in , $curr_key = 0)
{
static $ret;
if( array_key_exists($vars[$curr_key], $find_in) ) {
if( count( $vars)-1 == $curr_key ) {
$ret = $find_in[$vars[$curr_key]];
}
elseif( $curr_key < count( $vars)-1 ) {
_findRequestParam( $vars, $find_in[$vars[$curr_key]], $curr_key+1 );
}
}
return $ret;
}
?>
Hope this will help someone!
14-Jul-2007 08:34
Another note on unquoted array indices. Because it is first interpreted as a constant, it must obey the naming convention of constants. i.e. a letter or underscore followed by optional letter, digit and/or underscore characters.
Therefore while the following array declaration is legal:
$a = array('1st'=>'First','2nd'=>'Second');
Trying to access either array item as follows causes an error:
$first = "$a[1st]";
$second = "$a[2nd]";
10-Jul-2007 05:41
<b>Mark Gukov</b> wrote below:
Regarding the fact that there's no need to quote arrays keys when enclosed in double quotes: it only applies to single dimensional arrays.
The following works fine:
<?php
$r['a'] = 'apple';
echo "$r[a] is tasty.";
?>
...but in the case of multi-dimensional arrays:
<?php
$r['a']['b'] = 'banana';
echo "$r[a][b] is tasty.";
?>
would result in "Array[c] is tasty."
-----------------------------------------------------------------
However, the following runs fine;
$r['a']['b'] = 'banana';
echo "{$r[a][b]} is tasty.";
Just box it!
23-May-2007 05:37
It's slightly faster to use array_splice to remove an element of an array:
array_splice($array, $index, 1)
than to do it using the suggested method of unset and reindex:
unset($array[$index]);
$array = array_values($array);
The difference, however, is very small. With 950 iterations I had times of
unset and reindex: 0.22837495803833
splice: 0.22392416000366
20-Mar-2007 03:14
This Indonesian number speller function is twice
faster(*) than the one provided in class Terbilang by
anghuda(at)gmail(dot)com (25-May-2006 08:52):
http://www.lesantoso.com/terbilang.html
(*) 2.1 vs. 4.2 seconds in processing 10000 random numbers
16-Mar-2007 02:44
On array recursion...
Given the following code:
<?
$myarray = array('test',123);
$myarray[] = &$myarray;
print_r($myarray);
?>
The print_r() will display *RECURSION* when it gets to the third element of the array.
There doesn't appear to be any other way to scan an array for recursive references, so if you need to check for them, you'll have to use print_r() with its second parameter to capture the output and look for the word *RECURSION*.
It's not an elegant solution, but it's the only one I've found, so I hope it helps someone.
16-Jan-2007 05:55
About the automatic conversion of bare strings...
My opinion is that it never should have been implemented. Isn't it easier to NOT implement this "handy" feature in the first place? It is such a convenient way for "smart" programmers to write unsafe, not-futureproof code. Please remove this feature from future versions of PHP, please. (Hey, if you could change the OOP mechanisms between PHP 4 and PHP 5, why can't you make this change, right?)
This page should include details about how associative arrays are implemened inside PHP; e.g. using hash-maps or b-trees.
This has important implictions on the permance characteristics of associative arrays and how they should be used; e.g. b-tree are slow to insert but handle collisions better than hashmaps. Hashmaps are faster if there are no collisions, but are slower to retrieve when there are collisions. These factors have implictions on how associative arrays should be used.
27-Sep-2006 02:18
Regarding the fact that there's no need to quote arrays keys when enclosed in double quotes: it only applies to single dimensional arrays.
The following works fine:
<?php
$r['a'] = 'apple';
echo "$r[a] is tasty.";
?>
...but in the case of multi-dimensional arrays:
<?php
$r['a']['b'] = 'banana';
echo "$r[a][b] is tasty.";
?>
would result in "Array[c] is tasty."
21-Sep-2006 08:30
Regarding the message of phoenixbytes:
The line foreach($bad as $baddies); will just yield in $baddies the last value of the array $bad.
I think that wasn't your intention, in that case there are faster and better ways than foreach.
I think what you wanted to do is:
<?php
foreach($bad as $baddies) // make a collection
{
if (preg_match("/$baddies/i", $mailto)) // find a match
{
$addrmail = "false";
}
else
{
$addrmail = "true";
}
} // foreach end
?>
25-Jul-2006 04:28
in response to ch dot martin at gmail dot com
If you are using the following code:
<?php
$r = array('05' => "abc", '35' => "def");
foreach ($r as $key=>$value)
var_dump($key);
?>
and you need the array key '35' to be a string (for looping maybe), you can make sure the key is a string by appending a 0 on the front.
'035' instead of '35'
08-Jun-2006 11:40
Extremely irritating quirk regarding the variable types of array keys:
<?php
$r = array('05' => "abc", '35' => "def");
foreach ($r as $key=>$value)
var_dump($key);
?>
The first var_dump for '05' is:
string(2) "05"
as expected. But the second, '35', turns out as:
int(35)
Php apparently decided to make the 35 became an int, but not the 05 (presumably because it leads with a zero). As far as I can see, there is absolutely no way of making string(2) "35" an array key.
25-May-2006 06:52
this is simpler tha function display_angka_bilangan by ktaufik(at)gmail(dot)com (16-Feb-2005 12:40)
<?
/*
*
* Class : Terbilang
* Spell quantity numbers in Indonesian or Malay Language
*
*
* author: huda m elmatsani
* 21 September 2004
* freeware
*
* example:
* $bilangan = new Terbilang;
* echo $bilangan -> eja(137);
* result: seratus tiga puluh tujuh
*
*
*/
Class Terbilang {
function terbilang() {
$this->dasar = array(1=>'satu','dua','tiga','empat','lima','enam',
'tujuh','delapan','sembilan');
$this->angka = array(1000000000,1000000,1000,100,10,1);
$this->satuan = array('milyar','juta','ribu','ratus','puluh','');
}
function eja($n) {
$i=0;
while($n!=0){
$count = (int)($n/$this->angka[$i]);
if($count>=10) $str .= $this->eja($count). " ".$this->satuan[$i]." ";
else if($count > 0 && $count < 10)
$str .= $this->dasar[$count] . " ".$this->satuan[$i]." ";
$n -= $this->angka[$i] * $count;
$i++;
}
$str = preg_replace("/satu puluh (\w+)/i","\\1 belas",$str);
$str = preg_replace("/satu (ribu|ratus|puluh|belas)/i","se\\1",$str);
return $str;
}
}
?>
09-May-2006 01:46
phoenixbytes: The regex you have posted for matching email addresses is incorrect. Among other things, it does not allow '+' before the '@' (which is perfectly valid and can be quite useful to separate extensions of a single address). RFC 822 [1] defines the grammar for valid email addresses, and (the extemely long) regex implementing can be found at [2]. Even the "Add Note" page here at php.net says:
[quote]
And if you're posting an example of validating email addresses, please don't bother. Your example is almost certainly wrong for some small subset of cases. See this information from O'Reilly Mastering Regular Expressions book for the gory details.
[/quote]
A note to others: please do your homework before writing another email-matching regex.
[1] http://www.ietf.org/rfc/rfc0822.txt?number=822
[2] http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html.
16-Apr-2006 05:10
i use the array() function for deciding upon an email address's validity, i have a 'wap stalker' of my site that loves to exploit every hole i leave, so i used the following script to avoid being email bombed with my own file sender script, the array() is used to filter out undesirable email providers and, of course, any and all of my own addresses. before all that i used a REGEX to make sure it's an actual email address before going any further.
$mailto = "mail.domain.org"; // the input to be tested
if (preg_match("/^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,6}$/i", $mailto)) // see if it's really an email address
{
$bad = array('mytrashmail.com', 'mymail.ro', 'acasa.ro', 'gala.net', 'phoenixbytes'); // pick out the victims
foreach($bad as $baddies); // make a collection
if (preg_match("/$baddies/i", $mailto)) // find a match
{
$addrmail = "false";
}
else
{
$addrmail = "true";
}
}
else
{
$addrmail = "false";
}
$addrmail can then be used in an argument.
$baddies can be used to give a list, if necessary.
i hope this helps someone.
01-Apr-2006 12:54
Passing variables into the array constructor:
Just a NOOB pointer, I couldn't find other examples for this. If you want to pass the value of an existing variable into the array() constructor, you can quote it or not, both methods are valid.
<?
$foo_value = 'foo string';
$bar_value = 'bar string';
$myArray = array(
'foo_key' => $foo_value, // not quoted
'bar_key' => "$bar_value"); // quoted
foreach ($myArray as $k => $v) {
echo "\$myArray[$k] => $v.<br />\n";
}
?>
Both of these will work as expected, but the unqoted $foo_value method above is marginally faster because adding quotes adds an additional string de-reference.
13-Dec-2005 09:41
if you need to check a multidimensonal array for values it's handy to store it like
$ar['key1'][0]
$ar['key2'][0]
$ar['key3'][0]
$ar['key1'][1]
$ar['key2'][1]
$ar['key3'][1]
and to loop the keys.
Fill the array (from a database-request):
while($rf=mysql_fetch_row($rs))
{
$nr=$rf[0];
$channel['nr'][$nr]=$rf[1];
$channel['chatter'][$nr]=$rf[2];
}
Call the values:
foreach(array_keys($channel['nr']) as $test)
{
print ' nr:'.$test.'<br>';
print 'value nr: '.$channel['nr'][$test].'<br>';
print ' chatter: '.$channel['chatter'][$test].'<br>';
}
This is useful, if you have to look later for an element
inside the array:
if(in_array($new_value,$channel['nr'])) print 'do something.';
Hope this helps someone.
30-Sep-2005 02:55
Regarding the previous comment, beware of the fact that reference to the last value of the array remains stored in $value after the foreach:
<?php
foreach ( $arr as $key => &$value )
{
&