Warum nicht forSchleife für count($arr) - 1Iterationen verwenden?
Marcin
1
Wie bestimmen Sie, wenn Sie gemischte Schlüssel haben, welcher Schlüssel der letzte ist? Wenn Sie möchten, dass es als letztes Element zum Array hinzugefügt wird, sollten einige Daten vorhanden sein, die einen Zeitstempel angeben.
Rasika
Definition für last: durch die innere Reihenfolge des Arrays. Das ist identisch mit dem letzten Element, das die foreach-Schleife auswählen wird
$array = array('a' => 1,'b' => 2,'c' => 3);
$lastElement = end($array);
foreach($array as $k => $v) {
echo $v . '<br/>';
if($v == $lastElement) {
// 'you can do something here as this condition states it just entered last element of an array';
}
}
Update1
Wie von @Mijoja hervorgehoben, kann das oben genannte Problem auftreten, wenn Sie denselben Wert mehrmals im Array haben. Unten ist die Lösung dafür.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
//point to end of the array
end($array);
//fetch key of the last element of the array.
$lastElementKey = key($array);
//iterate the arrayforeach($array as $k => $v) {
if($k == $lastElementKey) {
//during array iteration this condition states the last element.
}
}
Update2
Ich fand die Lösung von @onteria_ besser als das, was ich beantwortet habe, da sie den internen Zeiger des Arrays nicht ändert. Ich aktualisiere die Antwort so, dass sie mit seiner Antwort übereinstimmt.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
// Get array keys
$arrayKeys = array_keys($array);
// Fetch last array key
$lastArrayKey = array_pop($arrayKeys);
//iterate arrayforeach($array as $k => $v) {
if($k == $lastArrayKey) {
//during array iteration this condition states the last element.
}
}
Vielen Dank, dass Sie @onteria_
Update3
Wie von @CGundlach gezeigt, wurde PHP 7.3 eingeführt, array_key_lastwas eine viel bessere Option ist, wenn Sie PHP> = 7.3 verwenden
$array = array('a' => 1,'b' => 2,'c' => 3);
$lastKey = array_key_last($array);
foreach($array as $k => $v) {
echo $v . '<br/>';
if($k == $lastKey) {
// 'you can do something here as this condition states it just entered last element of an array';
}
}
Dies wird Probleme haben, wenn Sie den gleichen Wert mehrmals im Array haben
Mijoja
1
@IbrahimAzharArmar Ich habe gerade diese Antwort gefunden und bei der Implementierung Ihrer Lösung festgestellt, dass es seit PHP 7.3 jetzt die Funktion gibt array_key_last, die auch den letzten Schlüssel eines Arrays zurückgibt, ohne den internen Zeiger zu beeinflussen: Secure.php.net/array_key_last . Würde Ihre Lösung noch weiter vereinfachen :)
CGundlach
1
@CGundlach das ist gut zu wissen. Aktualisiert die Antwort. Vielen Dank.
Ibrahim Azhar Armar
26
Das macht immer den Trick für mich
foreach($array as $key => $value) {
if (end(array_keys($array)) == $key)
// Last key reached
}
Bearbeiten 30/04/15
$last_key = end(array_keys($array));
reset($array);
foreach($array as $key => $value) {
if ( $key == $last_key)
// Last key reached
}
Um die von @Warren Sergent erwähnte E_STRICT-Warnung zu vermeiden
Ich bin mir nicht sicher, warum dieser Kommentar nicht die akzeptierte Antwort ist. Es ist bei weitem die einfachste / sauberste aller bereitgestellten Antworten und funktioniert für die überwiegende Mehrheit der potenziellen Anwendungsfälle (dh assoziative und aufgezählte Arrays).
Pierce
1
@Pierce, um Ihnen einen Hinweis zu geben: Dies wurde dreieinhalb Jahre nach der akzeptierten Antwort beantwortet. Wenn Sie 1000 Elemente in Ihrem Array haben, rufen Sie 1000-mal "end" und 1000-mal "array_keys" auf.
StefanNch
Dies hat eindeutig Leistungsprobleme, wenn Sie über ein großes Array iterieren. Mein Vorschlag in diesem Fall ist, das Ende (array_keys ($ array)) außerhalb der Schleife zu verschieben. Stellen Sie jedoch sicher, dass Sie das Array vor der Iteration zurücksetzen.
Richard Merchant
Wenn Sie pedantisch sein möchten, wird im strengen Modus end (array_keys ($ array)) als "Nur Variablen sollten als Referenz übergeben werden" angezeigt. Um dies zu korrigieren, definieren Sie $ array_keys = array_keys ($ array) und rufen Sie auf end () für die Variable $ array_keys.
Warren Sergent
14
$myarray = array(
'test1' => 'foo',
'test2' => 'bar',
'test3' => 'baz',
'test4' => 'waldo'
);
$myarray2 = array(
'foo',
'bar',
'baz',
'waldo'
);
// Get the last array_key
$last = array_pop(array_keys($myarray));
foreach($myarray as $key => $value) {
if($key != $last) {
echo"$key -> $value\n";
}
}
// Get the last array_key
$last = array_pop(array_keys($myarray2));
foreach($myarray2 as $key => $value) {
if($key != $last) {
echo"$key -> $value\n";
}
}
Da array_popdas von array_keysihm erstellte temporäre Array funktioniert, wird das ursprüngliche Array überhaupt nicht geändert.
Ich mag dies besser als die akzeptierte Antwort, da nur eine Zeile für die Initialisierung außerhalb der Schleife erforderlich ist.
Jordan Lev
Ich mag dies besser als die akzeptierte Antwort, weil es den internen Zeiger des Arrays, über das Sie eine Schleife ausführen möchten, nicht ändert.
Autonym
dasselbe für das erste Element zu tun$first = array_shift(array_keys($myarray2));
Lukas
2
Dies erzeugt einen Hinweis in E_STRICT: Laufzeit Hinweis: Nur Variablen sollten als Referenz übergeben werden
Vigintas Labakojis
Dies scheint ein besserer Ansatz als meine Antwort zu sein und meine Antwort zu aktualisieren.
Ibrahim Azhar Armar
5
Warum nicht diese sehr einfache Methode:
$i = 0; //a counter to track which element we are atforeach($array as $index => $value) {
$i++;
if( $i == sizeof($array) ){
//we are at the last element of the array
}
}
Ich weiß, dass dies alt ist und die Verwendung des SPL-Iterators vielleicht nur ein Overkill ist, aber trotzdem eine andere Lösung hier:
$ary = array(1, 2, 3, 4, 'last');
$ary = newArrayIterator($ary);
$ary = newCachingIterator($ary);
foreach ($ary as $each) {
if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator// just to use this `hasNext()` method to see// if this is the last elementecho $each;
}
}
$array = [...];
$last = count($array) - 1;
foreach($array as $index => $value)
{
if($index == $last)
// this is last arrayelse// this is not last array
}
Dies ist sehr schön und einfach, solange Ihre Array-Schlüssel automatisch generiert wurden.
Matt Kieran
0
Wenn die Artikel numerisch sortiert sind, ermitteln Sie mit der Funktion key () den Index des aktuellen Artikels und vergleichen Sie ihn mit der Länge. Sie müssten next () oder prev () verwenden, um Elemente in einer while-Schleife anstelle einer for-Schleife zu durchlaufen:
$length = sizeOf($arr);
while (key(current($arr)) != $length-1) {
$v = current($arr); doSomething($v); //do something if not the last item
next($myArray); //set pointer to next item
}
Weil es das erste ist, was ich gefunden habe, als ich gegoogelt habe. Es ist gut, all die verschiedenen Möglichkeiten zu kennen, um dasselbe zu tun und sich besser auskennen zu können. : D
trusktr
1
Funktioniert nicht für nicht numerische oder anderweitig nicht streng bestellte Artikel
for
Schleife fürcount($arr) - 1
Iterationen verwenden?Antworten:
Sie können PHPs end () verwenden
$array = array('a' => 1,'b' => 2,'c' => 3); $lastElement = end($array); foreach($array as $k => $v) { echo $v . '<br/>'; if($v == $lastElement) { // 'you can do something here as this condition states it just entered last element of an array'; } }
Update1
Wie von @Mijoja hervorgehoben, kann das oben genannte Problem auftreten, wenn Sie denselben Wert mehrmals im Array haben. Unten ist die Lösung dafür.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); //point to end of the array end($array); //fetch key of the last element of the array. $lastElementKey = key($array); //iterate the array foreach($array as $k => $v) { if($k == $lastElementKey) { //during array iteration this condition states the last element. } }
Update2
Ich fand die Lösung von @onteria_ besser als das, was ich beantwortet habe, da sie den internen Zeiger des Arrays nicht ändert. Ich aktualisiere die Antwort so, dass sie mit seiner Antwort übereinstimmt.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); // Get array keys $arrayKeys = array_keys($array); // Fetch last array key $lastArrayKey = array_pop($arrayKeys); //iterate array foreach($array as $k => $v) { if($k == $lastArrayKey) { //during array iteration this condition states the last element. } }
Vielen Dank, dass Sie @onteria_
Update3
Wie von @CGundlach gezeigt, wurde PHP 7.3 eingeführt,
array_key_last
was eine viel bessere Option ist, wenn Sie PHP> = 7.3 verwenden$array = array('a' => 1,'b' => 2,'c' => 3); $lastKey = array_key_last($array); foreach($array as $k => $v) { echo $v . '<br/>'; if($k == $lastKey) { // 'you can do something here as this condition states it just entered last element of an array'; } }
quelle
array_key_last
, die auch den letzten Schlüssel eines Arrays zurückgibt, ohne den internen Zeiger zu beeinflussen: Secure.php.net/array_key_last . Würde Ihre Lösung noch weiter vereinfachen :)Das macht immer den Trick für mich
foreach($array as $key => $value) { if (end(array_keys($array)) == $key) // Last key reached }
Bearbeiten 30/04/15
$last_key = end(array_keys($array)); reset($array); foreach($array as $key => $value) { if ( $key == $last_key) // Last key reached }
Um die von @Warren Sergent erwähnte E_STRICT-Warnung zu vermeiden
quelle
$myarray = array( 'test1' => 'foo', 'test2' => 'bar', 'test3' => 'baz', 'test4' => 'waldo' ); $myarray2 = array( 'foo', 'bar', 'baz', 'waldo' ); // Get the last array_key $last = array_pop(array_keys($myarray)); foreach($myarray as $key => $value) { if($key != $last) { echo "$key -> $value\n"; } } // Get the last array_key $last = array_pop(array_keys($myarray2)); foreach($myarray2 as $key => $value) { if($key != $last) { echo "$key -> $value\n"; } }
Da
array_pop
das vonarray_keys
ihm erstellte temporäre Array funktioniert, wird das ursprüngliche Array überhaupt nicht geändert.$ php test.php test1 -> foo test2 -> bar test3 -> baz 0 -> foo 1 -> bar 2 -> baz
quelle
$first = array_shift(array_keys($myarray2));
Warum nicht diese sehr einfache Methode:
$i = 0; //a counter to track which element we are at foreach($array as $index => $value) { $i++; if( $i == sizeof($array) ){ //we are at the last element of the array } }
quelle
Ich weiß, dass dies alt ist und die Verwendung des SPL-Iterators vielleicht nur ein Overkill ist, aber trotzdem eine andere Lösung hier:
$ary = array(1, 2, 3, 4, 'last'); $ary = new ArrayIterator($ary); $ary = new CachingIterator($ary); foreach ($ary as $each) { if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator // just to use this `hasNext()` method to see // if this is the last element echo $each; } }
quelle
Meine Lösung, auch ganz einfach ..
$array = [...]; $last = count($array) - 1; foreach($array as $index => $value) { if($index == $last) // this is last array else // this is not last array }
quelle
Wenn die Artikel numerisch sortiert sind, ermitteln Sie mit der Funktion key () den Index des aktuellen Artikels und vergleichen Sie ihn mit der Länge. Sie müssten next () oder prev () verwenden, um Elemente in einer while-Schleife anstelle einer for-Schleife zu durchlaufen:
$length = sizeOf($arr); while (key(current($arr)) != $length-1) { $v = current($arr); doSomething($v); //do something if not the last item next($myArray); //set pointer to next item }
quelle
$arr = array(1, 'a', 3, 4 => 1, 'b' => 1); foreach ($arr as $key => $val) { echo "{$key} = {$val}" . (end(array_keys($arr))===$key ? '' : ', '); } // output: 0 = 1, 1 = a, 2 = 3, 4 = 1, b = 1
quelle