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
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
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_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';
}
}
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
$array_keys = array_keys($array);
$last_key = end($array_keys);
$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
$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
}
}
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;
}
}
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
}
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
}
$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
forSchleife fürcount($arr) - 1Iterationen verwenden?