1169 Stimmen

PHP Array löschen nach Wert (nicht Schlüssel)

Ich habe ein PHP-Array wie folgt:

$messages = [312, 401, 1599, 3, ...];

Ich möchte das Element löschen, das den Wert $del_val (zum Beispiel, $del_val=401 ), aber ich kenne den Schlüssel nicht. Das könnte helfen: jeder Wert kann nur einmal vorhanden sein .

Ich bin auf der Suche nach der einfachsten Funktion, um diese Aufgabe zu erfüllen, bitte.

1 Stimmen

@Adam Strudwick Aber wenn Sie viele Löschungen in diesem Array haben, wäre es dann besser, es einmal zu iterieren und den Schlüssel mit dem Wert gleichzusetzen?

1 Stimmen

0 Stimmen

13voto

Koushik Das Punkte 7270

PHP 7.4 oder höher

function delArrValues(array $arr, array $remove) {
    return array_filter($arr, fn($e) => !in_array($e, $remove));
};

Wenn Sie also das Array als

$messages = [312, 401, 1599, 3];

und Sie wollen beide entfernen 3, 312 aus dem Array $messages, Sie würden dies tun

delArrValues($messages, [3, 312])

Sie würde zurückkehren

[401, 1599]

Das Beste daran ist, dass Sie problemlos mehrere Werte filtern können, auch wenn derselbe Wert mehrfach vorkommt.

12voto

SaidbakR Punkte 12544

Die akzeptierte Antwort konvertiert das Array in vereinigende Reihe Wenn Sie es also gerne als nicht-assoziativ Array mit der akzeptierten Antwort, müssen Sie möglicherweise array_values auch.

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

Die Referenz lautet hier verlinkt

8voto

Rajendra Khabiya Punkte 1980

Um mehrere Werte zu löschen, versuchen Sie dies:

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

7voto

Ismael Punkte 2298

Wenn Sie den Schlüssel nicht kennen, bedeutet das, dass er nicht wichtig ist.

Sie können den Wert als Schlüssel angeben, dann wird der Wert sofort gefunden. Besser als die Suche in allen Elementen immer und immer wieder.

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed

6voto

John Skoumbourdis Punkte 2731

Ich habe die Logik von underscore.JS _.reject übernommen und zwei Funktionen erstellt (Menschen bevorzugen Funktionen!!)

array_reject_value: Diese Funktion lehnt einfach den angegebenen Wert ab (funktioniert auch für PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject: Diese Funktion lehnt einfach die aufrufbare Methode ab (funktioniert für PHP >=5.3)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

In unserem aktuellen Beispiel können wir die oben genannten Funktionen also wie folgt verwenden:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

oder noch besser: (da dies uns eine bessere Syntax gibt, wie die array_filter ein)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

Die obige Methode kann für kompliziertere Dinge verwendet werden, z. B. wenn wir alle Werte, die größer oder gleich 401 sind, entfernen möchten:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X