Die Frage ist einfach. Ich habe eine foreach
Schleife in meinem Code:
foreach($array as $element) {
//code
}
In dieser Schleife möchte ich anders reagieren, wenn wir uns in der ersten oder letzten Iteration befinden.
Wie macht man das?
Sie könnten einen Zähler verwenden:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
array_shift
undarray_pop
. Obwohl dies die Lösung ist, die ich gefunden hätte, wenn ich so etwas implementieren müsste, würde ich mich jetzt an die Antwort von Rok Kralj halten .$i = 1
, müssen Sie sich keine Sorgen machen$len - 1
, verwenden Sie einfach$len
.Wenn Sie eine Lösung bevorzugen, bei der der Zähler außerhalb der Schleife nicht initialisiert werden muss, schlage ich vor, den aktuellen Iterationsschlüssel mit der Funktion zu vergleichen, die Ihnen den letzten / ersten Schlüssel des Arrays angibt.
Dies wird mit dem kommenden PHP 7.3 etwas effizienter (und lesbarer).
Lösung für PHP 7.3 und höher:
Lösung für alle PHP-Versionen:
quelle
end()
+key()
über jede Iteration der Schleife - wenn es beides ist, werden jedes Mal 4 Methoden aufgerufen. Zugegeben, das wären sehr einfache Operationen und wahrscheinlich nur Zeigersuchen, aber dann geben die Dokumente dies anreset()
undend()
ändern den internen Zeiger des Arrays - ist es also schneller als ein Zähler? möglicherweise nicht.reset()
Anruf vor dem foreach verschieben und das Ergebnis zwischenspeichern$first
.Um den letzten Artikel zu finden, funktioniert dieser Code jedes Mal:
quelle
next
: Warnung Diese Funktion gibt möglicherweiseFALSE
einen Booleschen Wert zurück , kann aber auch einen nicht-Booleschen Wert zurückgeben, der ausgewertet wirdFALSE
. Bitte lesen Sie den Abschnitt über Boolesche Werte für weitere Informationen. Verwenden Sie den===
Operator zum Testen des Rückgabewerts dieser Funktion.[true,true,false,true]
. Aber ich persönlich werde dies immer dann verwenden, wenn ich es mit einem Array zu tun habe, das keinen Booleschen Wert enthältfalse
.next()
sollte NIEMALS in einer foreach-Schleife verwendet werden. Es bringt den internen Array-Zeiger durcheinander. Weitere Informationen finden Sie in der Dokumentation.Eine vereinfachte Version des oben genannten und vorausgesetzt, Sie verwenden keine benutzerdefinierten Indizes ...
Version 2 - Weil ich gekommen bin, um das else zu verabscheuen, es sei denn, es ist notwendig.
quelle
if ($index == count($array) - 1)
. Siehe hier .Sie können das erste und das letzte Element aus dem Array entfernen und separat verarbeiten.
So was:
Das Entfernen aller Formatierungen in CSS anstelle von Inline-Tags würde Ihren Code verbessern und die Ladezeit verkürzen.
Sie können auch vermeiden, HTML mit PHP-Logik zu mischen, wann immer dies möglich ist.
Ihre Seite könnte viel lesbarer und wartbarer werden, indem Sie folgende Dinge trennen:
quelle
Ein Versuch, den ersten zu finden, wäre:
quelle
Einfach das funktioniert!
Vielen Dank für Ihre @billynoah das Aussortieren Ende Problem.
quelle
if ($key === $lastkey)
.if ($lastkey === $key)
?PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
key()
bekommt eine ganze Zahl, nichtend()
.end()
" gibt den Wert des letzten Elements zurück " undkey()
erwartet ein Array als Eingabe.1: Warum nicht eine einfache
for
Aussage verwenden? Angenommen, Sie verwenden ein reales Array und kein Array, könnenIterator
Sie leicht überprüfen, ob die Zählervariable 0 oder eins weniger als die Gesamtzahl der Elemente ist. Meiner Meinung nach ist dies die sauberste und verständlichste Lösung ...2: Sie sollten in Betracht ziehen, verschachtelte Mengen zum Speichern Ihrer Baumstruktur zu verwenden. Zusätzlich können Sie das Ganze durch rekursive Funktionen verbessern.
quelle
for
möchten, können Sie eine Schleife von1
bis ausführenn-1
und dasif
s aus dem Körper entfernen. Es macht keinen Sinn, sie wiederholt zu überprüfen.Beste Antwort:
quelle
Die effizienteste Antwort von @morg funktioniert im Gegensatz dazu
foreach
nur für richtige Arrays, nicht für Hash-Map-Objekte. Diese Antwort vermeidet den Overhead einer bedingten Anweisung für jede Iteration der Schleife, wie in den meisten dieser Antworten (einschließlich der akzeptierten Antwort), indem das erste und das letzte Element spezifisch behandelt und die mittleren Elemente durchlaufen werden.Das
array_keys
Funktion kann verwendet werden, damit die effiziente Antwort wie folgt funktioniertforeach
:Ich habe diesbezüglich kein Benchmarking durchgeführt, aber der Schleife wurde keine Logik hinzugefügt. Dies ist der größte Leistungseinbruch. Daher würde ich vermuten, dass die mit der effizienten Antwort gelieferten Benchmarks ziemlich nahe beieinander liegen.
Wenn Sie so etwas funktionalisieren wollten , habe ich hier eine solche iterateList-Funktion ausprobiert . Möglicherweise möchten Sie jedoch den Kerncode vergleichen, wenn Sie sich große Sorgen um die Effizienz machen. Ich bin mir nicht sicher, wie viel Overhead der gesamte Funktionsaufruf mit sich bringt.
quelle
Bei Skripten zur Generierung von SQL-Abfragen oder bei Skripten, die eine andere Aktion für das erste oder letzte Element ausführen, ist es viel schneller (fast doppelt so schnell), unnötige Variablenprüfungen zu vermeiden.
Die aktuell akzeptierte Lösung verwendet eine Schleife und eine Prüfung innerhalb der Schleife, die bei jeder einzelnen Wiederholung durchgeführt wird. Der richtige (schnelle) Weg, dies zu tun, ist der folgende:
Ein kleiner hausgemachter Benchmark zeigte Folgendes:
test1: 100000 Läufe von Model Morg
Zeit: 1869.3430423737 Millisekunden
Test2: 100000 Modellläufe, wenn zuletzt
Zeit: 3235.6359958649 Millisekunden
Und so ist es ziemlich klar, dass der Scheck viel kostet, und natürlich wird es noch schlimmer, je mehr variable Schecks Sie hinzufügen;)
quelle
$arr = array('one' => "1 1 1", 4 => 'Four', 1 => 'One'); $numItems = count($arr); $i=0; $firstitem=$arr[0]; echo $i . ': ' . $firstitem . ", "; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; echo $i . ': ' . $some_item . ", "; $i++; } $last_item=$arr[$i]; echo $i . ': ' . $last_item . ", "; $i++;
wird ausgegeben:0: , 1: One, 2: ,
array()
wird erstellt,{'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}
aber die leeren Elemente werden mit count ignoriert. Sie zählen die Anzahl der definierten "Dinge". BOUNTY SACRIFICE EINGEHEND! Diese Antwort verdient Kopfgeld, aber wenn @Morg. weg, es ist sinnlos. Ich würde einer Person Kopfgeld geben, die SO wahrscheinlich nicht mehr verwenden wird! Wenn er zurückkommt und seine Antwort verbessert, verdient er das Kopfgeld!array_keys
Funktion abrufen , die Sie wie ein Array behandeln können . Siehe meine "verbesserte" Antwort .$querySet = ""; foreach ($fieldSet as $key=>$value) { $value = $db->dbLink->quote($value); $querySet .= "$key = $value, "; } $querySet = substr_replace($querySet, "", -2); $queryString = "UPDATE users SET $querySet WHERE user_ID = '$user_ID'";
Mit Schlüsseln und Werten funktioniert dies auch:
quelle
Die Verwendung einer booleschen Variablen ist immer noch die zuverlässigste, selbst wenn Sie das erste Auftreten von a überprüfen möchten
$value
(ich fand es in meiner Situation und in vielen Situationen nützlicher) , wie folgt:Wie wäre
!next( $array )
es dann, den letzten zu finden, der$value
zurückkehrt,true
wenn es keinennext()
Wert zum Iterieren gibt.Und ich bevorzuge es, eine
for
Schleife zu verwenden , anstattforeach
einen Zähler wie diesen zu verwenden:quelle
Ich bin auf diesen Thread gestoßen, als ich das gleiche Problem habe. Ich brauche nur das erste Element, dann analysiere ich meinen Code erneut, bis mir dies einfiel.
Die obigen Codes sind großartig und vollständig, aber wenn Sie nur das erste Element benötigen, können Sie diesen Code ausprobieren.
quelle
Ich bin mir nicht sicher, ob es noch notwendig ist. Die folgende Lösung sollte jedoch mit Iteratoren funktionieren und ist nicht erforderlich
count
.quelle
Sie können auch eine anonyme Funktion verwenden:
Drei weitere Dinge sollten erwähnt werden:
array_values
zuerst .$element
Sie es als Referenz übergeben (&$element
).$indexOfLastElement
demuse
Konstrukt aufgelistet werden, bei Bedarf erneut als Referenz.quelle
Sie können den Zähler und die Array-Länge verwenden.
quelle
quelle
Verwenden von reset ($ array) und end ($ array)
Demo repl.it
quelle
Versuche dies:
quelle