Überprüfen Sie während der Array-Iteration, ob das aktuelle Element das letzte Element ist

78

Bitte helfen Sie mir, diesen Pseudocode in echten PHP-Code zu übersetzen:

 foreach ($arr as $k => $v)
    if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
        doSomething();

Bearbeiten: Das Array kann numerische oder String-Schlüssel haben

Shealtiel
quelle
6
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
shealtiel

Antworten:

135

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_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'; 
    }
}
Ibrahim Azhar Armar
quelle
10
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

$array_keys = array_keys($array);
$last_key = end($array_keys);
Richard Merchant
quelle
viel eleganter und einfacher! :)
Rafael Moni
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.

$ php test.php
test1 -> foo
test2 -> bar
test3 -> baz
0 -> foo
1 -> bar
2 -> baz
onteria_
quelle
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 at
foreach($array as $index => $value) {
    $i++;
    if( $i == sizeof($array) ){
        //we are at the last element of the array
    }
}
PreciousFocus
quelle
2

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;
    }
}
unifreak
quelle
1

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
}
Edwin Wong
quelle
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
}
trusktr
quelle
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
Shealtiel
0
$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
Luca Filosofi
quelle