Υπάρχει ένας εύκολος τρόπος να διαγράψετε ένα στοιχείο από έναν πίνακα χρησιμοποιώντας την PHP, έτσι ώστε το foreach ($array)
να μην περιλαμβάνει πλέον αυτό το στοιχείο;
Σκέφτηκα ότι αν το έβαζα σε null
θα το έκανε, αλλά προφανώς δεν λειτουργεί.
Υπάρχουν διάφοροι τρόποι για να διαγράψετε ένα στοιχείο πίνακα, όπου κάποιοι είναι πιο χρήσιμοι για κάποιες συγκεκριμένες εργασίες από άλλους.
Αν θέλετε να διαγράψετε μόνο ένα στοιχείο πίνακα μπορείτε να χρησιμοποιήσετε την \unset()
ή εναλλακτικά την \array_splice()
.
Επίσης αν έχετε την τιμή και δεν γνωρίζετε το κλειδί για να διαγράψετε το στοιχείο μπορείτε να χρησιμοποιήσετε την \array_search()
για να βρείτε το κλειδί.
\unset()
μέθοδοςΣημειώστε ότι όταν χρησιμοποιείτε την \unset()
τα κλειδιά του πίνακα δεν θα αλλάξουν/αναπροσδιοριστούν. Αν θέλετε να αναπροσαρμόσετε την ευρετηρίαση των κλειδιών μπορείτε να χρησιμοποιήσετε την \array_values()
μετά την \unset()
η οποία θα μετατρέψει όλα τα κλειδιά σε αριθμητικά κλειδιά απαρίθμησης ξεκινώντας από το 0.
Κώδικας
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
Έξοδος
[
[0] => a
[2] => c
]
\array_splice()
μέθοδοςΑν χρησιμοποιήσετε την \array_splice()
τα κλειδιά θα αναπροσαρμοστούν αυτόματα, αλλά τα συσχετιστικά κλειδιά δεν θα αλλάξουν σε αντίθεση με την \array_values()
η οποία θα μετατρέψει όλα τα κλειδιά σε αριθμητικά κλειδιά.
Επίσης, η \array_splice()
χρειάζεται το offset, όχι το κλειδί! ως δεύτερη παράμετρο.
Κώδικας
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
Έξοδος
[
[0] => a
[1] => c
]
Η array_splice()
όπως και η \unset()
παίρνουν τον πίνακα με αναφορά, και αυτό σημαίνει ότι δεν θέλετε να αναθέσετε τις τιμές επιστροφής αυτών των συναρτήσεων πίσω στον πίνακα.
Αν θέλετε να διαγράψετε πολλαπλά στοιχεία του πίνακα και δεν θέλετε να καλέσετε την \unset()
ή την \array_splice()
πολλές φορές, μπορείτε να χρησιμοποιήσετε τις συναρτήσεις \array_diff()
ή \array_diff_key()
ανάλογα με το αν γνωρίζετε τις τιμές ή τα κλειδιά των στοιχείων που θέλετε να διαγράψετε.
\array_diff()
μέθοδοςΕάν γνωρίζετε τις τιμές των στοιχείων του πίνακα που θέλετε να διαγράψετε, τότε μπορείτε να χρησιμοποιήσετε τη μέθοδο \array_diff()
. Όπως και πριν με την \unset()
δεν θα αλλάξει/αναπροσδιορίσει τα κλειδιά του πίνακα.
Κώδικας
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
Έξοδος
[
[1] => b
]
\array_diff_key()
μέθοδοςΑν γνωρίζετε τα κλειδιά των στοιχείων που θέλετε να διαγράψετε, τότε θέλετε να χρησιμοποιήσετε τη μέθοδο \array_diff_key()
. Εδώ πρέπει να βεβαιωθείτε ότι περνάτε τα κλειδιά ως κλειδιά στη δεύτερη παράμετρο και όχι ως τιμές. Διαφορετικά, πρέπει να αναποδογυρίσετε τον πίνακα με την \array_flip()
. Και επίσης εδώ τα κλειδιά δεν θα αλλάξουν/αναπροσδιοριστούν.
Κώδικας
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
Έξοδος
[
[1] => b
]
Επίσης, αν θέλετε να χρησιμοποιήσετε την \unset()
ή την \array_splice()
για να διαγράψετε πολλαπλά στοιχεία με την ίδια τιμή, μπορείτε να χρησιμοποιήσετε την \array_keys()
για να πάρετε όλα τα κλειδιά για μια συγκεκριμένη τιμή και στη συνέχεια να διαγράψετε όλα τα στοιχεία.
Θα πρέπει να σημειωθεί ότι η unset()
θα διατηρήσει τους δείκτες ανέγγιχτους, κάτι που είναι αυτό που θα περιμένατε όταν χρησιμοποιείτε δείκτες συμβολοσειρών (πίνακας ως hashtable), αλλά μπορεί να σας εκπλήξει όταν έχετε να κάνετε με πίνακες με ακέραιο δείκτη:
$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[3]=>
int(3)
} */
$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */
Έτσι, το array_splice()
μπορεί να χρησιμοποιηθεί αν θέλετε να κανονικοποιήσετε τα ακέραια κλειδιά σας. Μια άλλη επιλογή είναι η χρήση της array_values()
μετά την unset()
:
$array = array(0, 1, 2, 3);
unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */
unset($array[$index]);