Gibt es eine einfache Möglichkeit, ein Element mit PHP aus einem Array zu löschen, z foreach ($array)
enthält dieses Element nicht mehr?
Ich dachte, dass es auf einstellen null
würde es tun, aber anscheinend funktioniert es nicht.
Ben
Gibt es eine einfache Möglichkeit, ein Element mit PHP aus einem Array zu löschen, z foreach ($array)
enthält dieses Element nicht mehr?
Ich dachte, dass es auf einstellen null
würde es tun, aber anscheinend funktioniert es nicht.
Es gibt verschiedene Möglichkeiten, ein Array-Element zu löschen, wobei einige für bestimmte Aufgaben nützlicher sind als andere.
Wenn Sie nur ein Array-Element löschen möchten, können Sie verwenden unset()
oder alternativ \array_splice()
.
Wenn Sie den Wert kennen und den Schlüssel zum Löschen des Elements nicht kennen, können Sie es verwenden \array_search()
um den Schlüssel zu bekommen. Dies funktioniert nur, wenn das Element nicht mehr als einmal vorkommt, da \array_search
gibt nur den ersten Treffer zurück.
unset()
Beachten Sie dies bei der Verwendung unset()
Die Array-Schlüssel ändern sich nicht. Wenn Sie die Schlüssel neu indizieren möchten, können Sie verwenden \array_values()
nach dem unset()
wodurch alle Schlüssel in numerisch aufgezählte Schlüssel konvertiert werden, beginnend bei 0.
Code:
$array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
// ↑ Key which you want to delete
Ausgabe:
[
[0] => a
[2] => c
]
\array_splice()
MethodeWenn du benutzt \array_splice()
Die Schlüssel werden automatisch neu indiziert, aber die assoziativen Schlüssel ändern sich nicht – im Gegensatz zu \array_values()
wodurch alle Tasten in numerische Tasten umgewandelt werden.
\array_splice()
braucht die versetztnicht der Schlüsselals zweiter Parameter.
Code:
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
// ↑ Offset which you want to delete
Ausgabe:
[
[0] => a
[1] => c
]
array_splice()
gleich wie unset()
, nehmen Sie das Array als Referenz. Die Rückgabewerte dieser Funktionen weisen Sie dem Array nicht zurück.
Wenn Sie mehrere Array-Elemente löschen und nicht aufrufen möchten unset()
oder \array_splice()
Sie können die Funktionen mehrfach verwenden \array_diff()
oder \array_diff_key()
je nachdem, ob Sie die Werte oder die Schlüssel der Elemente kennen, die Sie löschen möchten.
\array_diff()
MethodeWenn Sie die Werte der Array-Elemente kennen, die Sie löschen möchten, können Sie verwenden \array_diff()
. Wie zuvor mit unset()
Die Schlüssel des Arrays werden nicht geändert.
Code:
$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = \array_diff($array, ["a", "c"]);
// └────────┘
// Array values which you want to delete
Ausgabe:
[
[1] => b
]
\array_diff_key()
MethodeWenn Sie die Schlüssel der Elemente kennen, die Sie löschen möchten, dann möchten Sie sie verwenden \array_diff_key()
. Sie müssen sicherstellen, dass Sie die Schlüssel als Schlüssel im zweiten Parameter übergeben und nicht als Werte. Schlüssel werden nicht neu indiziert.
Code:
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
// ↑ ↑
// Array keys which you want to delete
Ausgabe:
[
[1] => b
]
Wenn Sie verwenden möchten unset()
oder \array_splice()
um mehrere Elemente mit demselben Wert zu löschen, können Sie verwenden \array_keys()
um alle Schlüssel für einen bestimmten Wert zu erhalten und dann alle Elemente zu löschen.
@AlexandruRada Nein, du hast gesagt „benutze das nicht“ – und das ist nur Unsinn. Sie können diese Methode sicher verwenden, wenn Sie ein Array als das behandeln, was es ist – ein Wörterbuch. Nur wenn Sie aufeinanderfolgende numerische Indizes erwarten, müssen Sie etwas anderes verwenden.
– Konrad Rudolf
13. Juni 2012 um 12:26 Uhr
@AlexandruRada Das kannst du auf keinen Fall haben array (3) { [0]=>int(0) ...
wenn du unset($x[2])
von $x = array(1, 2, 3, 4);
Ergebnis Muss sein var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) }
(war wahrscheinlich ein Tippfehler)
– inemanja
19. April 2016 um 5:33 Uhr
unset
kann mehrere Argumente haben: void unset ( mixed $var [, mixed $... ] )
.
– Константин Ван
14. April 2017 um 3:12 Uhr
array_filter ist auch eine praktikable Methode. Besonders gut, wenn Sie das Array nicht mutieren möchten, aber es wird auch nicht neu indiziert, was ein Problem mit json_encode sein kann. php.net/manual/en/function.json-encode.php#94157
– dotnetZimmermann
6. Mai 2017 um 0:20 Uhr
unset
ist keine Funktion, sondern ein Sprachkonstrukt (und ein Schlüsselwort). Es darf und kann nicht mit “ vorangestellt werden
– hvertös
3. Dezember 2019 um 14:19 Uhr
Stefan Gehrig
Es sollte erwähnt werden, dass unset()
lässt Indizes unverändert, was Sie erwarten würden, wenn Sie String-Indizes (Array als Hashtable) verwenden, aber bei der Arbeit mit ganzzahligen indizierten Arrays ziemlich überraschend sein können:
$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)
} */
Damit array_splice()
kann verwendet werden, wenn Sie Ihre Integer-Schlüssel normalisieren möchten. Eine weitere Option ist die Verwendung array_values()
nach dem 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)
} */
Es ist erwähnenswert, dass Sie bei der Verwendung von array_splice() den OFFSET kennen müssen, nicht den Schlüssel, sondern den Offset (!) des Elements, das Sie entfernen möchten
– Tom
8. Juni 2012 um 21:57 Uhr
@Tom: Für ein reguläres Array (das kontinuierlich ganzzahlig indiziert ist) ist der Offset der Index. Das ist wo array_splice
kann (unter anderem) Sinn machen.
– Stefan Gehrig
9. Juni 2012 um 12:18 Uhr
Ja natürlich, aber nur etwas, an das Sie sich erinnern sollten, wenn Sie das Array manipulieren, bevor Sie Splice verwenden
– Tom
9. Juni 2012 um 16:12 Uhr
Von nur einem einfachen Test zum Löschen einer Tonne von Elementen aus einem gigantischen Array scheint array_splice viel schneller und weniger speicherintensiv zu sein. Dies stimmt mit dem überein, was ich erwarten würde: array_values() scheint eine Kopie des Arrays zu erstellen, während array_splice an Ort und Stelle funktioniert.
– Doug Kavendek
1. Dezember 2014 um 17:01 Uhr
array_values ist ein nützlicher Ansatz, wenn Sie Elemente in einer Schleife entfernen und möchten, dass die Indizes konsistent sind, sie aber nach der Schleife komprimieren möchten.
– Rorrik
2. Juni 2015 um 16:38 Uhr
Marcel Cozma
// Our initial array
$arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
print_r($arr);
// Remove the elements who's values are yellow or red
$arr = array_diff($arr, array("yellow", "red"));
print_r($arr);
Dies ist die Ausgabe des obigen Codes:
Array
(
[0] => blue
[1] => green
[2] => red
[3] => yellow
[4] => green
[5] => orange
[6] => yellow
[7] => indigo
[8] => red
)
Array
(
[0] => blue
[1] => green
[4] => green
[5] => orange
[7] => indigo
)
Jetzt wird array_values() ein numerisches Array gut neu indizieren, aber es wird alle Schlüsselzeichenfolgen aus dem Array entfernen und sie durch Zahlen ersetzen. Wenn Sie die Schlüsselnamen (Strings) beibehalten oder das Array neu indizieren müssen, wenn alle Schlüssel numerisch sind, verwenden Sie array_merge():
$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);
Ausgänge
Array
(
[0] => blue
[1] => green
[2] => green
[3] => orange
[4] => indigo
)
$get_merged_values = array_merge($daten[‘res’],$daten[‘check_res’]); wenn ich das drucke print_r($get_merged_values); es zeigt folgendes an. Reihe ( [0] => Anordnung ( [menu_code] => 2 [menu_name] => Pflanze [menu_order_no] => 1 ) [1] => Anordnung ( [menu_code] => 3 [menu_name] => Linie [menu_order_no] => 2 ) ) Aber ich muss die Werte von menu_code und menu_name mit $get_merged_values bekommen[‘menu_code’] und $get_merged_values[‘menu_name’] bzw. statt $get_merged_values zu verwenden[0][menu_code]$get_merged_values[0][menu_name]. Bitte helfen Sie mir, wie das geht?
– Herzhacker
20. September 2018 um 5:56 Uhr
Die Formulierung der Frage ist irreführend, wie sie formuliert ist. Dies funktioniert nicht, wenn Sie $arr löschen möchten[$i] in einer foreach-Schleife, wenn mehr als ein Element den gleichen Wert hat.
– Jed Lynch
13. Oktober 2020 um 14:38 Uhr
liamvictor
$key = array_search($needle, $array);
if ($key !== false) {
unset($array[$key]);
}
unset($array[$index]);
Robin Nixon
Wenn Sie ein numerisch indiziertes Array haben, in dem alle Werte eindeutig sind (oder sie nicht eindeutig sind, aber Sie alle Instanzen eines bestimmten Werts entfernen möchten), können Sie einfach array_diff() verwenden, um ein übereinstimmendes Element zu entfernen, wie folgt:
$my_array = array_diff($my_array, array('Value_to_remove'));
Zum Beispiel:
$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);
Dies zeigt Folgendes an:
4
3
In diesem Beispiel wird das Element mit dem Wert „Charles“ entfernt, wie durch die Aufrufe von sizeof() verifiziert werden kann, die eine Größe von 4 für das anfängliche Array und 3 nach dem Entfernen melden.
Mohammed
Auch für ein benanntes Element:
unset($array["elementName"]);
$a = array("A"=>1, "B"=>2, "C"=>"a");
print_r($a);
unset($a["B"]);
print_r($a);
ergibt (formatiert): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a )
– Tag des Fenstersturzes
9. Juni 2011 um 1:50 Uhr
Es scheint, dass Sie Array-Elemente, die durch eine Zeichenfolge indiziert sind, nicht zurücksetzen können (erzeugt “Fatal error: Cannot unset string offsets”). Ich glaube nicht, dass dies immer der Fall war, aber sicherlich ab PHP 5.3.10 und wahrscheinlich früher
– Karpien
6. April 2012 um 0:29 Uhr
@carpii PHP kann Elemente aus einem assoziativen Array zurücksetzen. Der schwerwiegende Fehler wird verursacht, wenn Sie versuchen, unset($var[‘key’]) auf einem String statt einem Array Beispiel: $array = array( ‘test’ => ‘value’, ‘another’ => ‘value’, ); unset($array[‘test’]); // Entfernt das “test”-Element wie erwartet aus dem Array $array = ‘test’; unset($array[‘test’]); // Löst wie erwartet “Fatal error: Cannot unset string offsets” aus
– Jimbo
20. März 2013 um 9:56 Uhr
Hier müssen Sie den Schlüsselnamen kennen, besser: stackoverflow.com/a/52826684/1407491
– Nabi KAZ
16. Oktober 2018 um 1:23 Uhr
@Eran bereits empfohlen unset()
zurück im Jahr 2008! Wenn Sie diesen Rat verbessern wollten, hätten Sie diese Antwort bearbeiten sollen. Auf dieser Seite mit mehreren Registerkarten gibt es viel zu viele redundante Inhalte!
– mickmackusa
23. August 2021 um 0:22 Uhr
Ich würde nicht sagen, dass Konrad die einfachste Antwort auf das genannte Problem ist. Mit
unset()
Die Iterationen über das Array enthalten den entfernten Wert nicht mehr. OTOH, es ist wahr, dass die Antwort von Stevan umfangreich ist und eigentlich die Antwort war, nach der ich gesucht habe – aber nicht das OP 🙂– brandizzi
26. Juli 2012 um 17:05 Uhr
@danip Leicht im Handbuch zu finden, schließt eine Frage zu StackOverflow nicht aus. Wäre die Frage a Duplikat StackOverflow-Frage, dann gehört es vielleicht nicht hierher. StackOverflow ist ein guter Ort, um Antworten als Einstiegsoption zu finden, noch bevor Sie in das Handbuch geschaut haben.
– Dan Nissenbaum
11. Februar 2014 um 5:18 Uhr
@unset($array[$key]); $array = array_values($array);
– Trojaner
4. September 2014 um 12:55 Uhr
Wenn Sie Schlüssel aus einem Array von Arrays (assoziatives Array) entfernen möchten, sehen Sie sich die Lösung unter stackoverflow.com/a/47978980/1045444 an
– Somnath Muluk
26. Dezember 2017 um 13:10 Uhr
Sie können dies in einer Foreach-Schleife wie folgt tun: pastefs.com/pid/130950
– Aurangzeb
25. Juni 2019 um 10:50 Uhr