Wie finde ich heraus, ob ein Wert in einem Array vorhanden ist, und entferne ihn dann? Nach dem Entfernen benötige ich die sequentielle Indexreihenfolge.
Gibt es hierfür in PHP integrierte Array-Funktionen?
ENTWICKLUNGEN
Wie finde ich heraus, ob ein Wert in einem Array vorhanden ist, und entferne ihn dann? Nach dem Entfernen benötige ich die sequentielle Indexreihenfolge.
Gibt es hierfür in PHP integrierte Array-Funktionen?
mohitsoni
Um ein Element in einem Array zu suchen, können Sie verwenden array_search
Funktion und um ein Element aus einem Array zu entfernen, das Sie verwenden können unset
Funktion. Ex:
<?php
$hackers = array ('Alan Kay', 'Peter Norvig', 'Linus Trovalds', 'Larry Page');
print_r($hackers);
// Search
$pos = array_search('Linus Trovalds', $hackers);
// array_seearch returns false if an element is not found
// so we need to do a strict check here to make sure
if ($pos !== false) {
echo 'Linus Trovalds found at: ' . $pos;
// Remove from array
unset($hackers[$pos]);
}
print_r($hackers);
Sie können sich beziehen auf: https://www.php.net/manual/en/ref.array.php für weitere Array-bezogene Funktionen.
Was ist, wenn es keine genaue Übereinstimmung gibt? Wie führe ich eine Wildcard-Suche durch?
– Clain Dsilva
12. November 2014 um 2:26 Uhr
Beachte das auch unset()
verwandelt das Array in ein assoziatives Array. Um es wieder in ein Array (ohne Schlüssel) umzuwandeln, verwenden Sie array_values()
– Jespertheend
3. August 2016 um 21:36 Uhr
Um nach dem Wert eines Schlüssels zu suchen, können Sie dies mit kombinieren array_column
dh: $pos = array_search(1234, array_column('id', $dataset));
– Geoffrey
1. Januar 2017 um 3:41 Uhr
<?php
$my_array = array('sheldon', 'leonard', 'howard', 'penny');
$to_remove = array('howard');
$result = array_diff($my_array, $to_remove);
?>
Kann mehrere Werte ohne Schleifen entfernen!
– dfmiller
4. März 2014 um 22:15 Uhr
+1 vermeidet das mühsame Überprüfen des Rückgabewerts von array_search
– Rinogo
15. Juli 2014 um 14:25 Uhr
Scheint effizienter zu sein, das Array $to_remove kann mit einer array_search- oder preg_grep-Funktion erstellt werden, falls Sie die Platzhaltersuche verwenden, um Elemente zu entfernen.
– Clain Dsilva
12. November 2014 um 2:30 Uhr
Diese Lösung ist für mich sauberer. Beachten Sie jedoch, dass Indizes beibehalten werden. Wenn Sie sie also in numerischer Reihenfolge neu anordnen möchten, sollten Sie dies tun: array_values(array_diff($my_array, $to_remove))
– luis.ap.uyen
27. November 2018 um 13:48 Uhr
Dies sollte die richtige Antwort sein. Wenn der Wert nicht gefunden wird, bleibt das Array unberührt. Vielen Dank!
– gtamboro
19. Februar um 14:55 Uhr
Kerry Jones
Sie müssen zuerst den Schlüssel des Arrays finden, dies kann mit erfolgen array_search()
Wenn Sie fertig sind, verwenden Sie die nicht gesetzt()
<?php
$array = array( 'apple', 'orange', 'pear' );
unset( $array[array_search( 'orange', $array )] );
?>
Dies ist das Ergebnis-Array ( [0] => Apfel [1] => orange [2] => Birne [3] => grün ) Warnung: Falsche Parameteranzahl für array_search() in C:\wamp\www\test\test.php auf Zeile 5 Array ( [0] => Apfel [1] => orange [2] => Birne [3] => grün )
– DEVOPS
17. Juni 2010 um 6:43 Uhr
@learner das Heuhaufen-Argument fehlte de3.php.net/manual/en/function.array-search.php – Das Handbuch ist dein Freund.
– Gordon
17. Juni 2010 um 6:45 Uhr
Jawohl. das wird funktionieren $array = array( ‘apfel’, ‘orange’, ‘birne’, ‘grün’ ); unset($array[array_search(‘orange’, $array)]); aber die Array-Sequenz fehlt. Wie man das korrigiert
– DEVOPS
17. Juni 2010 um 6:49 Uhr
Was meinst du damit, dass die Sequenz fehlt? In welcher Reihenfolge soll es sein?
– Kerry Jones
17. Juni 2010 um 6:53 Uhr
Array-Index ist 0 2 3 4 ist jetzt 1 fehlt Ich brauche es wie 0 1 2 4 .. usw
– DEVOPS
17. Juni 2010 um 6:54 Uhr
Nur für den Fall, dass Sie einen der genannten Codes verwenden möchten, beachten Sie dies array_search
gibt FALSE zurück, wenn die „Nadel“ nicht in „Heuhaufen“ gefunden wird und daher würden diese Beispiele das erste (null-indizierte) Element zurücksetzen. Verwenden Sie stattdessen Folgendes:
<?php
$haystack = Array('one', 'two', 'three');
if (($key = array_search('four', $haystack)) !== FALSE) {
unset($haystack[$key]);
}
var_dump($haystack);
Das obige Beispiel wird ausgegeben:
Array
(
[0] => one
[1] => two
[2] => three
)
Und das ist gut!
Höhle Johnson
Sie können verwenden array_filter
um Elemente eines Arrays basierend auf einer Callback-Funktion herauszufiltern. Die Rückruffunktion nimmt jedes Element des Arrays als Argument und Sie kehren einfach zurück false
wenn dieses Element entfernt werden soll. Dies hat auch den Vorteil, dass doppelte Werte entfernt werden, da das gesamte Array gescannt wird.
Sie können es wie folgt verwenden:
$myArray = array('apple', 'orange', 'banana', 'plum', 'banana');
$output = array_filter($myArray, function($value) { return $value !== 'banana'; });
// content of $output after previous line:
// $output = array('apple', 'orange', 'plum');
Und wenn Sie das Array neu indizieren möchten, können Sie das Ergebnis an übergeben array_values
so was:
$output = array_values($output);
Gemeinschaft
Diese Lösung ist die Kombination aus der Lösung von @Peter zum Löschen mehrerer Vorkommen und der Lösung von @chyno zum Entfernen des ersten Vorkommens. Das ist es, was ich benutze.
/**
* @param array $haystack
* @param mixed $value
* @param bool $only_first
* @return array
*/
function array_remove_values(array $haystack, $needle = null, $only_first = false)
{
if (!is_bool($only_first)) { throw new Exception("The parameter 'only_first' must have type boolean."); }
if (empty($haystack)) { return $haystack; }
if ($only_first) { // remove the first found value
if (($pos = array_search($needle, $haystack)) !== false) {
unset($haystack[$pos]);
}
} else { // remove all occurences of 'needle'
$haystack = array_diff($haystack, array($needle));
}
return $haystack;
}
Schauen Sie auch hier: PHP-Array löschen nach Wert (nicht Schlüssel)
Robert Witting
Das unset
array_search
hat einige ziemlich schreckliche Nebenwirkungen, da es versehentlich das erste Element aus Ihrem Array entfernen kann, unabhängig vom Wert:
// bad side effects
$a = [0,1,2,3,4,5];
unset($a[array_search(3, $a)]);
unset($a[array_search(6, $a)]);
$this->log_json($a);
// result: [1,2,4,5]
// what? where is 0?
// it was removed because false is interpreted as 0
// goodness
$b = [0,1,2,3,4,5];
$b = array_diff($b, [3,6]);
$this->log_json($b);
// result: [0,1,2,4,5]
Wenn Sie wissen, dass der Wert garantiert im Array ist, machen Sie es, aber ich denke, das array_diff
ist weitaus sicherer. (Ich benutze php7)
Nur wenn Sie keinen strengen Vergleich für false
. Die Antworten von Algorhythm und Chyno vor vielen Jahren machen diesen Fehler nicht.
– mickmackusa
22. Januar um 4:19 Uhr