Εργασία με σημαίες σε PHP
Τώρα θα μάθουμε να δουλεύουμε με σημαίες.
Μια σημαία είναι μια ειδική μεταβλητή που
μπορεί να πάρει μόνο δύο τιμές: true
και false. Με τη βοήθεια σημαιών μπορούμε να λύσουμε
προβλήματα που ελέγχουν την απουσία κάτι:
για παράδειγμα, μπορούμε να ελέγξουμε ότι σε έναν πίνακα
δεν υπάρχει στοιχείο με μια συγκεκριμένη τιμή. Ας
ξεκινήσουμε.
Ας λύσουμε το ακόλουθο πρόβλημα: δίνεται ένας πίνακας
με αριθμούς, πρέπει να ελέγξουμε αν υπάρχει σε αυτόν
στοιχείο με τιμή 3 ή όχι. Αν
υπάρχει - θα εκτυπώσουμε '+++', αν όχι -
θα εκτυπώσουμε '---'.
Αρχικά ας προσπαθήσουμε να εκτυπώσουμε '+++'.
Για αυτό θα διατρέξουμε όλα τα στοιχεία του πίνακά μας
και με if θα ρωτάμε - είναι ίσο το τρέχον
στοιχείο με την τιμή 3. Αν είναι ίσο - θα εκτυπώσουμε
'+++':
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
}
}
?>
Αλλά η λύση μας δεν είναι πολύ καλή: γιατί αν
στον πίνακα υπάρχει όχι μία τιμή 3,
αλλά πολλές, τότε το '+++' θα εκτυπωθεί πολλές
φορές. Ας διορθώσουμε τον πίνακά μας (ας κάνουμε
δύο στοιχεία με τιμή 3) και ας βεβαιωθούμε σε αυτό:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // θα εκτυπωθεί πολλές φορές
}
}
?>
Ας διορθώσουμε το πρόβλημα: θα τερματίσουμε τον βρόχο με τη βοήθεια
break, αν το στοιχείο έχει ήδη βρεθεί:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
break; // τερματίζουμε τον βρόχο
}
}
?>
Ας προσπαθήσουμε τώρα να κάνουμε έτσι ώστε,
αν στον πίνακα δεν υπάρχουν καθόλου στοιχεία με τιμή
3, να εκτυπώνεται '---'. Μια διαδεδομένη
πλάνη είναι να προσθέσουμε else στο
if μας - σε αυτήν την περίπτωση το '---' θα
εκτυπώνεται για όλα τα στοιχεία που δεν είναι
3:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // θα εκτυπωθεί στο στοιχείο 3
} else {
echo '---'; // θα εκτυπωθεί στα στοιχεία 1, 2, 4, 5
}
}
?>
Έτσι, η ιδέα να προσθέσουμε else - είναι κακή
ιδέα, δεν λειτουργεί. Για την επίλυση προβλημάτων τέτοιου
τύπου (τέτοια προβλήματα συναντώνται αρκετά
συχνά) χρησιμοποιούνται οι λεγόμενες σημαίες.
Όπως ήδη αναφέρθηκε παραπάνω, μια σημαία είναι μια τέτοια
μεταβλητή, που μπορεί να πάρει δύο τιμές:
true ή false.
Λοιπόν, ας κάνουμε μια μεταβλητή flag
με την εξής τιμή: αν είναι ίση με true,
τότε στον πίνακα υπάρχει στοιχείο 3, ενώ αν
false, τότε ένα τέτοιο στοιχείο δεν υπάρχει.
Αρχικά θα ορίσουμε τη μεταβλητή flag
στην τιμή false - δηλαδή θα θεωρήσουμε,
ότι το στοιχείο 3 στον πίνακα δεν υπάρχει:
$arr = [1, 2, 3, 4, 5];
$flag = false; // θεωρούμε ότι το στοιχείο 3 δεν υπάρχει στον πίνακα
Στη συνέχεια, θα ξεκινήσουμε έναν βρόχο με if όπως το κάναμε
προηγουμένως. Αν ο βρόχος ανακαλύψει ότι στον πίνακα
υπάρχει στοιχείο 3 - τότε θα ορίσουμε τη μεταβλητή flag
στην τιμή true και θα βγούμε από τον βρόχο
με τη βοήθεια του break:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false; // θεωρούμε ότι το στοιχείο 3 δεν υπάρχει στον πίνακα
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true; // το στοιχείο υπάρχει - θα επαναπροσδιορίσουμε τη μεταβλητή $flag
break; // θα βγούμε από τον βρόχο
}
}
?>
Την απάντηση στο ερώτημα, αν υπάρχει στον πίνακα 3
ή όχι, μπορούμε να δώσουμε μόνο μετά το πέρας του βρόχου.
Και αυτή η απάντηση την έχουμε ήδη: μετά το πέρας του βρόχου
η μεταβλητή flag μπορεί να έχει μείνει false
ή να έχει αλλάξει την τιμή της σε true,
αν ο βρόχος ανίχνευσε στον πίνακα 3:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
// εδώ η μεταβλητή $flag είναι ίση είτε true, είτε false
?>
Τώρα μετά το πέρας του βρόχου μπορούμε να κάνουμε ένα if, που
θα κοιτάξει τη μεταβλητή flag και θα εκτυπώσει
στην οθόνη '+++' ή '---':
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
if ($flag === true) {
echo '+++';
} else {
echo '---';
}
?>
Δίνεται ένας πίνακας:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
Ελέγξτε ότι σε αυτόν τον πίνακα υπάρχει στοιχείο
'c'. Αν υπάρχει - εκτυπώστε '+++',
και αν όχι - εκτυπώστε '---'.
Γράψτε κώδικα, που θα ελέγχει έναν αριθμό αν είναι πρώτος ή όχι. Ένας πρώτος αριθμός διαιρείται μόνο με τη μονάδα και με τον εαυτό του, και δεν διαιρείται με άλλους αριθμούς.