PHP: Wie entferne ich ein bestimmtes Element aus einem Array?

159

Wie entferne ich ein Element aus einem Array, wenn ich den Elementnamen kenne? beispielsweise:

Ich habe ein Array:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

Der Benutzer tritt ein strawberry

strawberry ist entfernt.

Um es vollständig zu erklären:

Ich habe eine Datenbank, in der eine durch Komma getrennte Liste von Elementen gespeichert ist. Der Code ruft die Liste basierend auf einer Benutzerauswahl auf, in der sich diese Auswahl befindet. Wenn sie also Erdbeere wählen, zieht sie den Code in jeden Eintrag, in dem sich Erdbeere befindet, und konvertiert diesen mit split () in ein Array. Ich möchte, dass sie die vom Benutzer ausgewählten Elemente, für dieses Beispiel Erdbeere, aus dem Array entfernen.

dcp3450
quelle
4
Gleiche Frage: stackoverflow.com/questions/7225070/…
Trante
1
Eine andere gleiche Frage: stackoverflow.com/questions/1883421/…
Eric Lavoie
1
mehr gleiche Frage: stackoverflow.com/questions/369602/…
Alex

Antworten:

295

Verwenden Sie array_search, um den Schlüssel zu erhalten und ihn zu entfernen, unsetfalls gefunden:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchGibt false zurück ( null bis PHP 4.2.0), wenn kein Element gefunden wurde.

Und wenn es mehrere Elemente mit demselben Wert geben kann, können array_keysSie die Schlüssel für alle Elemente abrufen:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
Gumbo
quelle
Ein merkwürdiges Ergebnis erzielen. Ich habe Ihren ersten Vorschlag verwendet, da es immer nur eine Instanz geben wird. Um es zu testen, ließ ich es einfach den Schlüsselwert ausgeben. Hat funktioniert. Es wird jedoch nicht deaktiviert.
dcp3450
1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ submenuArray = split (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450
@ dcp3450: Und was machst du damit $submenuArray? (Beachten Sie, dass mit jeder Schleife $submenuArrayüberschrieben wird.)
Gumbo
Ich habe meine Frage aktualisiert, um sie besser zu erklären. Grundsätzlich durchläuft der Code Einträge in einer Datenbank und entfernt die ausgewählten Elemente, in diesem Beispiel "Erdbeere". Der Benutzer gibt also eine Auswahl ein => der Code sucht unter Untermenüs und findet eine Liste mit dieser Option => verwandelt diese Liste in ein Array => entfernt die ausgewählte Option.
dcp3450
1
Ich habe es verstanden! Ich habe das neue Array nicht zurück in die Datenbank geschrieben. Leicht zu übersehende Dinge, wenn Sie so lange auf Code starren.
dcp3450
152

Verwendung array_diff()für 1-Linien-Lösung:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Keine zusätzlichen Funktionen oder foreach-Schleife erforderlich.

Krankheiten
quelle
8
Diese Lösung ist viel besser lesbar als die Top-Lösungen.
Robbert
Wenn strawberryes sich nicht im ursprünglichen Array befindet, wird es im $array_without_strawberriesArray verfügbar - gefährlicher Code, wenn Sie sicherstellen möchten, dass sich ein bestimmtes Element nicht in einem Array befindet.
Erfan
5
@Erfan Deine Behauptung ist falsch. $a = array_diff(array(), array('strawberry'));- $ a ist ein leeres Array.
Bancer
1
Du hast Recht @bancer - ich habe wahrscheinlich an array_intersect oder so gedacht.
Erfan
1
array_diff () ist eleganter als die markierte Antwort.
Dom DaFonte
36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
John Conde
quelle
2
Sie sollten testen, ob Erdbeere überhaupt im Array ist.
Gumbo
Nach Gumbos Rat wurde die Antwort geändert, um die Überprüfung des Elements einzuschließen, bevor es aus dem Array entfernt wird.
John Conde
2
Beachten Sie auch, dass die Indizes nach dem Löschen eines bestimmten Elements nicht neu ausgerichtet werden. Mit anderen Worten, die Indexsequenz weist dann Lücken auf. Wenn Sie 'Erdbeere' aus Ihrem Beispiel löschen, hat 'Kiwi' immer noch Index 4 und Index 2 verschwindet einfach. Es ist wichtig, ob Ihr Code von der Vollständigkeit der Indexsequenz abhängt, wie dies beispielsweise bei ($ i = 0; $ i <.., $ i ++) Schleifen der Fall ist.
der Bananenkönig
2
Um das zu ergänzen, was der Bananenkönig gesagt hat, tun Sie einfach, wenn Sie das Array neu indizieren möchten $my_array = array_values($my_array);.
Ryeguy
2
Während diese Lösung korrekt ist, durchsucht sie das Array ZWEIMAL ( in_arrayund array_search). Die Rückgabe von array_searchwie in Gumbos Antwort ist effektiver
Bogdan D
21

Wenn Sie hier ein einfaches Array verwenden (was der Fall zu sein scheint), sollten Sie stattdessen diesen Code verwenden:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) Entfernt nur das Element, ordnet das einfache Array jedoch nicht neu an.

Angenommen, wir haben ein Array und verwenden array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

Im Vergleich zu nicht gesetzt:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Beachten Sie, wie unset($array[$key])das Array nicht neu angeordnet wird.

ericluwj
quelle
Offiziell unsetgibt nichts zurück. So json_encode(unset($array[2]))ist für einen Vergleich nicht sachgemäßer.
Robsch
das ist genau das, was ich brauche, danke an ericluwj
ana
12

Sie können den Array-Filter verwenden, um die Elemente nach einer bestimmten Bedingung zu entfernen $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});
srcspider
quelle
Downvote. Diese schlechte Qualität (da es sich um eine reine Code-Antwort handelt und einen Analysefehler ausgibt) ist ein Duplikat der Methode von D.Martin, die lediglich eine anonyme Funktion verwendet array_filter(). Während ich persönlich eine anonyme Funktion in meiner Implementierung verwenden würde, glaube ich, dass die richtige Aktion für SO darin besteht, die Antwort von D.Martin zu kommentieren oder zu bearbeiten, wenn Sie eine Mikroverbesserung vornehmen möchten, damit diese Seite nicht aufgebläht wird. Bitte löschen Sie diese doppelte Antwort.
Mickmackusa
4

Wird so sein:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
D. Martin
quelle
4

Dies ist eine einfache Wiederholung, mit der mehrere Werte im Array gelöscht werden können.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
mmr
quelle
Dies ist ein ineffizienter, hausgemachter Ersatz für das, was die Entwickler von PHP bereits erstellt haben array_diff(). Wie kam es zu drei positiven Stimmen? Niemand sollte diese Antwort hilfreich finden oder in eigenen Projekten verwenden. Ich empfehle, diese Antwort zu löschen. Dies würde dazu dienen, Ihr Konto von einer Antwort von geringer Qualität zu befreien, das Aufblähen der Antworten auf dieser Seite zu verringern und Ihnen ein diszipliniertes Abzeichen zu verdienen. Ich werde meine Ablehnung verschieben, damit Sie Zeit haben, sie für eine Belohnung zu löschen.
Mickmackusa
4

Nur du kannst eine einzelne Zeile machen. Es wird ein Element aus dem Array entfernen


$array=array_diff($array,['strawberry']);

dılo sürücü
quelle
3

Ich benutze derzeit diese Funktion:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Sie können ein Array oder nur eine Zeichenfolge mit den Elementen eingeben, die entfernt werden sollen. Schreiben Sie es so:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

ODER

$detils = array_delete('orange', $detils);

Es wird es auch neu indizieren.

jankal
quelle
2
Das ist schrecklich verworren und durchgeknallt. Wie hat das 3 Upvotes bekommen?!?
Mickmackusa
2

Diese Frage hat mehrere Antworten, aber ich möchte noch etwas hinzufügen, weil ich bei der Verwendung unsetoder array_diffbeim Spielen mehrerer Indizes Probleme mit den Indizes des neuen Arrays hatte, als das bestimmte Element entfernt wurde (weil der ursprüngliche Index gespeichert wurde).

Ich komme auf das Beispiel zurück:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

oder

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Wenn Sie das Ergebnis drucken, erhalten Sie:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Ergebnis:

> apple
> orange
> blueberry
> kiwi

Die Indizes werden jedoch gespeichert, sodass Sie wie folgt auf Ihr Element zugreifen können:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

Daher wird das endgültige Array nicht neu indiziert. Sie müssen also nach dem unsetoder hinzufügen array_diff:

$array_without_strawberries = array_values($array);

Danach hat Ihr Array einen normalen Index:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Bezogen auf diesen Beitrag: Array neu indizieren

Geben Sie hier die Bildbeschreibung ein

Hoffe es wird helfen

Jordan Montel
quelle
1

Ein besserer Ansatz wäre möglicherweise, Ihre Werte als Schlüssel in einem assoziativen Array beizubehalten und sie dann aufzurufen array_keys(), wenn Sie ein tatsächliches Array erstellen möchten. Auf diese Weise müssen Sie nicht verwenden array_search, um Ihr Element zu finden.

Jishi
quelle
1
Ihr Beitrag ist ein Kommentar, keine Antwort. Bitte löschen und unter der Frage selbst posten.
Mickmackusa
1

Die Antwort auf das Löschen des PHP-Arrays nach Wert (nicht nach Schlüssel) Wird von https://stackoverflow.com/users/924109/rok-kralj angegeben

IMO ist die beste Antwort, da es entfernt und nicht mutiert

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Es verallgemeinert sich gut, Sie können so viele Elemente gleichzeitig entfernen, wie Sie möchten, wenn Sie möchten.

Haftungsausschluss: Beachten Sie, dass meine Lösung eine neue Kopie des Arrays erstellt, während die alte intakt bleibt, im Gegensatz zu der akzeptierten Antwort, die mutiert. Aus diesem Grund könnte es etwas langsamer sein.

verfolgt
quelle
1

Ich suchte nach der Antwort auf dieselbe Frage und stieß auf dieses Thema. Ich sehe zwei Hauptwege: die Kombination von array_search& unsetund die Verwendung von array_diff. Auf den ersten Blick schien mir die erste Methode schneller zu sein, da kein zusätzliches Array erstellt werden muss (wie bei der Verwendung array_diff). Aber ich habe einen kleinen Benchmark geschrieben und sichergestellt, dass die zweite Methode nicht nur präziser, sondern auch schneller ist! Freut mich, dies mit Ihnen zu teilen. :) :)

https://glot.io/snippets/f6ow6biaol

ПЭХАПЭШНИК
quelle
0

Ich würde es vorziehen, array_key_exists zu verwenden, um nach Schlüsseln in Arrays zu suchen, wie:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

um das angegebene effektiv zu finden, da array_search und in_array () hier nicht funktionieren. Und entfernen Sie Dinge mit unset () .

Ich denke, es wird jemandem helfen.

ddsultan
quelle
0

Erstellen Sie ein numerisches Array mit dem Löschen eines bestimmten Array-Werts

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Sie können diesen Link verweisen ..

Sashtha Manik
quelle
Downvote. In der Frage wird eindeutig gefragt, ob ein Wert basierend auf dem Wert (nicht dem Schlüssel) entfernt werden soll. Diese Antwort ist nutzlos, bitte löschen.
Mickmackusa
0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
Krishna Jonnalagadda
quelle
Diese Antwort entfernt nicht einmal die erforderliche Option.
Nigel Ren
-1

Verwenden array_seach()Sie die folgenden:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()Gibt den Schlüssel des gefundenen Elements zurück, mit dem dieses Element mithilfe von aus dem ursprünglichen Array entfernt werden kann unset(). Es wird FALSEbei einem Fehler zurückgegeben, kann jedoch bei Erfolg einen "Falsey" -Wert zurückgeben (Ihr Schlüssel kann 0beispielsweise sein), weshalb der strenge Vergleichsoperator !==verwendet wird.

Die if()Anweisung prüft, ob array_search()ein Wert zurückgegeben wurde, und führt nur dann eine Aktion aus, wenn dies der Fall ist.

Ravinder Singh
quelle
3
Downvote. Dies ist ein Duplikat der Gumbo-Methode (derzeit die akzeptierte Lösung), die Jahre vor Ihrer veröffentlicht wurde. Doppelte Antworten haben keinen Wert und verursachen nur unnötiges Aufblähen der Seite. Bitte löschen Sie Ihre Antwort. Wenn Sie Gumbos Antwort erklären möchten, bearbeiten Sie seine Antwort oder bitten Sie Gumbo, seine eigene Antwort zu erweitern.
mickmackusa
-1
unset($array[array_search('strawberry', $array)]);
max li
quelle
2
Downvote. Die array_search()- unset()Methode wurde bereits Jahre vor Ihrer von John Conde veröffentlicht. Doppelte Antworten haben für den Leser keinen Wert und sind aufgrund der Zeitverschwendung beim Scrollen und Lesen redundanter Informationen eine Unannehmlichkeit. Bitte löschen Sie diese Antwort.
Mickmackusa
-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
Onome Mine Adamu
quelle
2
Sie können diese Antwort verbessern, indem Sie ein oder zwei Sätze darüber schreiben, a) was der Code tut und b) warum Sie denken, dass dies eine Option unter allen anderen Antworten ist.
Robin Mackenzie
-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }
Rajendra Rajput
quelle
4
Zusätzlich zu der Antwort, die Sie gegeben haben, sollten Sie eine kurze Erklärung darüber geben, warum und wie dies das Problem behebt.
15.
-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);
user3296940
quelle
2
Bitte fügen Sie auch eine Erklärung hinzu. Wie es das Problem löst.
Rahil Wazir
Ihre Antwort ersetzen Sie ein Element des Arrays durch ein anderes NEIN, um ein Element zu entfernen
ahmed hamdy
Downvote. Diese Antwort liefert nicht die erwartete Ausgabe. Bitte löschen Sie diese falsche Antwort.
Mickmackusa