wake-up-neo.com

Finden Sie das letzte Element eines Arrays, während Sie eine foreach-Schleife verwenden PHP

Ich schreibe einen SQL-Abfrageersteller mit einigen Parametern. In Java ist es sehr einfach, das letzte Element eines Arrays aus der for-Schleife heraus zu ermitteln, indem einfach die aktuelle Array-Position mit der Array-Länge überprüft wird.

for(int i=0; i< arr.length;i++){
     boolean isLastElem = i== (arr.length -1) ? true : false;        
}

In PHP haben sie nicht ganzzahlige Indizes, um auf Arrays zuzugreifen. Sie müssen also ein Array mit einer foreach-Schleife durchlaufen. Dies wird problematisch, wenn Sie eine Entscheidung treffen müssen (in meinem Fall zum Anhängen oder/und Parameter beim Erstellen der Abfrage). 

Ich bin mir sicher, dass es dafür eine Standardmethode geben muss. 

Wie lösen Sie das in PHP?

182
Vaibhav Kamble

Es klingt so, als würden Sie so etwas wollen

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
  if(++$i === $numItems) {
    echo "last index!";
  }
}    

Davon abgesehen müssen Sie nicht durch ein "Array" mit foreach in PHP durchlaufen. 

271

Sie können den Wert des letzten Schlüssels des Arrays mit end(array_keys($array)) abrufen und mit dem aktuellen Schlüssel vergleichen:

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}
182
Jeremy Ruten

warum so kompliziert?

foreach($input as $key => $value) {
    $ret .= "$value";
    if (next($input)==true) $ret .= ",";
}

Dies fügt einen Wert hinter jedem Wert außer dem letzten hinzu!

37
Trikks

Wenn toEnd 0 erreicht, bedeutet dies, dass es sich beim letzten Durchlauf der Schleife befindet. 

$toEnd = count($arr);
foreach($arr as $key=>$value) {
  if (0 === --$toEnd) {
    echo "last index! $value";
  }
}

Der letzte Wert steht nach der Schleife noch zur Verfügung. Wenn Sie also nach der Schleife mehr Material verwenden möchten, ist dies besser:

foreach($arr as $key=>$value) {
  //something
}
echo "last index! $key => $value";

Wenn Sie den letzten Wert nicht als spezielle Inside-Schleifen behandeln möchten. Dies sollte schneller sein, wenn Sie große Arrays haben. (Wenn Sie das Array nach der Schleife innerhalb desselben Bereichs wiederverwenden, müssen Sie das Array zuerst "kopieren").

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop

//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);

//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";

foreach ($array as $key => $value) {
    //do something with all values before the last value
    echo "All except last value: $value", "\n";
}

//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

Und zur Beantwortung Ihrer ursprünglichen Frage "In meinem Fall zum Anhängen oder/und Parameter beim Erstellen der Abfrage"; Dadurch werden alle Werte durchlaufen und dann zu einem String mit "und" zwischen ihnen zusammengefügt, jedoch nicht vor dem ersten oder nach dem letzten Wert:

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);
22
OIS

Es gibt bereits viele Antworten, aber es lohnt sich auch, Iteratoren zu untersuchen, zumal es nach einem Standardverfahren gefragt wurde:

$arr = range(1, 3);

$it = new CachingIterator(new ArrayIterator($arr));
foreach($it as $key => $value)
{
  if (!$it->hasNext()) echo 'Last:';
  echo $value, "\n";
}

Möglicherweise finden Sie etwas, das auch für andere Fälle flexibler ist.

20
hakre

Eine Möglichkeit könnte sein, festzustellen, ob der Iterator next hat. Wenn an den Iterator kein nächster angeschlossen ist, befinden Sie sich in der letzten Schleife. 

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}
8
Raheel Khan

Wenn Ihr Array über eindeutige Array-Werte verfügt, ist die Bestimmung der letzten Iteration also trivial:

foreach($array as $element) {
    if ($element === end($array))
        echo 'LAST ELEMENT!';
}

Wie Sie sehen, funktioniert dies, wenn das letzte Element nur einmal im Array erscheint. Andernfalls erhalten Sie einen Fehlalarm. In diesem Fall müssen Sie die Schlüssel vergleichen (die eindeutig eindeutig sind).

foreach($array as $key => $element) {
    end($array);
    if ($key === key($array))
        echo 'LAST ELEMENT!';
}

Beachten Sie auch den strengen Coparision-Operator, der in diesem Fall sehr wichtig ist.

8
Rok Kralj

Angenommen, Sie haben das Array in einer Variablen gespeichert ...

foreach($array as $key=>$value) 
{ 
    echo $value;
    if($key != count($array)-1) { echo ", "; }
}
5

Wenn Sie für jedes Element etwas tun müssen, außer für das erste oder das letzte und nur dann, wenn das Array mehr als ein Element enthält, bevorzuge ich die folgende Lösung.

Ich weiß, dass es viele Lösungen gibt, die vor Monaten/ein Jahr vor meinen veröffentlicht wurden, aber dies ist meiner Meinung nach ziemlich elegant. Die Prüfung jeder Schleife ist auch eine boolesche Prüfung, im Gegensatz zu einer numerischen Prüfung "i = (count-1)", die möglicherweise weniger Aufwand verursacht.

Die Struktur der Schleife ist möglicherweise unangenehm, aber Sie können sie mit der Reihenfolge vonead (Anfang), tfoot (Ende), tbody (aktuell) in HTML-Tabellentags vergleichen.

$first = true;
foreach($array as $key => $value) {
    if ($first) {
        $first = false;
        // Do what you want to do before the first element
        echo "List of key, value pairs:\n";
    } else {
        // Do what you want to do at the end of every element
        // except the last, assuming the list has more than one element
        echo "\n";
    }
    // Do what you want to do for the current element
    echo $key . ' => ' . $value;
}

Wenn Sie in Web-Entwicklung beispielsweise jedem Element mit Ausnahme des letzten Elementes border-bottom in einer ungeordneten Liste (ul) hinzufügen möchten, können Sie stattdessen ein border-top zu) hinzufügen jedes Element außer dem ersten (das von IE7 + und Firefox/Webkit unterstützte CSS: first-child unterstützt diese Logik, wohingegen: last-child von IE7 nicht unterstützt wird).

Sie können die $ first-Variable auch für jede verschachtelte Schleife wiederverwenden. Die Dinge funktionieren einwandfrei, da jede Schleife $ first false während des ersten Prozesses der ersten Iteration darstellt (Brüche/Ausnahmen verursachen also keine Probleme). .

$first = true;
foreach($array as $key => $subArray) {
    if ($first) {
        $string = "List of key => value array pairs:\n";
        $first = false;
    } else {
        echo "\n";
    }

    $string .= $key . '=>(';
    $first = true;
    foreach($subArray as $key => $value) {
        if ($first) {
            $first = false;
        } else {
            $string .= ', ';
        }
        $string .= $key . '=>' . $value;
    }
    $string .= ')';
}
echo $string;

Beispielausgabe:

List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)
4
Ankit Aggarwal

Dies sollte der einfachste Weg sein, das letzte Element zu finden:

foreach ( $array as $key => $a ) {
    if ( end( array_keys( $array ) ) == $key ) {
        echo "Last element";
     } else {
        echo "Just another element";
     }
}  

Referenz: Link

4

Sie können diese Methode weiterhin mit assoziativen Arrays verwenden:

$keys = array_keys($array);
for ($i = 0, $l = count($array); $i < $l; ++$i) {
    $key = $array[$i];
    $value = $array[$key];
    $isLastItem = ($i == ($l - 1));
    // do stuff
}

// or this way...

$i = 0;
$l = count($array);
foreach ($array as $key => $value) {
    $isLastItem = ($i == ($l - 1));
    // do stuff
    ++$i;
}
3
nickf

Ihre Absicht, das EOF - Array zu finden, ist nur für den Kleber. Machen Sie sich mit der untenstehenden Taktik vertraut. Sie benötigen keine EOF: 

$given_array = array('column1'=>'value1',
                     'column2'=>'value2',
                     'column3'=>'value3');

$glue = '';
foreach($given_array as $column_name=>$value){
    $where .= " $glue $column_name = $value"; //appending the glue
    $glue   = 'AND';
}
echo $where;

o/p:

column1 = value1 AND column2 = value2 AND column3 = value3
3
Angelin Nadar

Ich habe das starke Gefühl, dass das OP an der Wurzel dieses "XY-Problems" nur die Funktion implode() wollte.

3

Es hört sich so an, als würden Sie so etwas wollen:

$array = array(
    'First',
    'Second',
    'Third',
    'Last'
);

foreach($array as $key => $value)
{
    if(end($array) === $value)
    {
       echo "last index!" . $value;
    }
}
2
Ashique CM

Sie könnten auch so etwas tun:

end( $elements );
$endKey = key($elements);
foreach ($elements as $key => $value)
{
     if ($key == $endKey) // -- this is the last item
     {
          // do something
     }

     // more code
}
1
KOGI

Ich mag das Folgende, weil ich es ziemlich ordentlich finde. Nehmen wir an, wir erstellen einen String mit Trennzeichen zwischen allen Elementen: z. ABC 

$first = true;
foreach ( $items as $item ) {
    $str = ($first)?$first=false:", ".$item;
}
1
Alastair Brayne

sie können zählen ().

for ($i=0;$i<count(arr);$i++){
    $i == count(arr)-1 ? true : false;
}

oder wenn Sie NUR nach dem letzten Element suchen, können Sie end () verwenden.

end(arr);

gibt nur das letzte Element zurück.

und wie sich herausstellt, können Sie PHP-Arrays nach ganzen Zahlen indexieren. Es ist absolut glücklich mit 

arr[1];
1
helloandre
1
Çağ

Fügen Sie nach dem letzten Wert kein Komma ein:

Das Array:

$data = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'];

Die Funktion:

$result = "";
foreach($data as $value) {
    $resut .= (next($data)) ? "$value, " : $value;
}

Das Ergebnis:

print $result;

lorem, Ipsum, Dolor, sitzen, amet

1
Santo Boldižar
foreach ($array as $key => $value) {

  $class = ( $key !== count( $array ) -1 ) ? " class='not-last'" : " class='last'";

  echo "<div{$class}>";
  echo "$value['the_title']";
  echo "</div>";

}

Referenz

1
Ayman Elshehawy

Einfacher von end() function ist eine eingebaute Funktion in PHP, mit der das letzte Element des angegebenen Arrays gesucht wird. Die Funktion end () ändert den internen Zeiger eines Arrays auf das letzte Element und gibt den Wert des letzten Elements zurück.

Nachfolgend ein Beispiel mit einem nicht ganzzahligen Index:

<?php
    $arr = array(
            'first' => 
                array('id' => 1, 'label' => 'one'), 
            'second' => 
                array('id' => 2, 'label' => 'two'), 
            'last' => 
                array('id' => 9, 'label' => 'nine')
        );
    $lastIndexArr = end($arr);
    print_r($lastIndexArr);

Hier prüfen das letzte Array als Ausgabe.

0
Bunker Boy

Hier haben Sie eine andere Möglichkeit, dies zu tun:

$arr = range(1, 10);

$end = end($arr);
reset($arr);

while( list($k, $v) = each($arr) )
{
    if( $n == $end )
    {
        echo 'last!';
    }
    else
    {
        echo sprintf('%s ', $v);
    }
}
0
Kevin

Hier ist meine Lösung: Ermitteln Sie einfach die Anzahl Ihres Arrays minus 1 (da sie bei 0 beginnen).

$lastkey = count($array) - 1;
foreach($array as $k=>$a){
    if($k==$lastkey){
        /*do something*/
    }
}
0
ITWitch

Wenn ich Sie verstehe, brauchen Sie nur das Array umzukehren und das letzte Element durch einen Pop-Befehl zu erhalten:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);
0
James

Ein anderer Weg ist, sich das vorherige Schleifenzyklusergebnis zu merken und es als Endergebnis zu verwenden:

    $result = $where = "";
    foreach ($conditions as $col => $val) {
        $result = $where .= $this->getAdapter()->quoteInto($col.' = ?', $val);
        $where .=  " AND ";
    }
    return $this->delete($result);
0
Leven

Sie können den letzten Index direkt abrufen, indem Sie:

$numItems = count($arr);

echo $arr[$numItems-1];

0
Denis Omeri

um das erste und letzte Element von jedem Array zu erhalten

foreach($array as $value) {
    if ($value === reset($array)) {
        echo 'FIRST ELEMENT!';
    }

    if ($value === end($array)) {
        echo 'LAST ITEM!';
    }
}
0
Darkcoder

Bei SQL-Abfragen, die Skripts generieren, oder bei anderen Aktionen, die für das erste oder letzte Element eine andere Aktion ausführen, ist es viel schneller (fast doppelt so schnell), dass unnötige Variablenprüfungen vermieden werden.

Die derzeit akzeptierte Lösung verwendet eine Schleife und eine Prüfung innerhalb der Schleife, die für every_single_iteration ausgeführt wird. Die richtige (schnelle) Methode ist die folgende:

$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
    $some_item=$arr[$i];
    $i++;
}
$last_item=$arr[$i];
$i++;

Ein kleiner hausgemachter Benchmark zeigte folgendes:

test1: 100000 Läufe von Modellmorg

zeit: 1869.3430423737 Millisekunden

test2: 100000 Modellläufe wenn zuletzt

zeit: 3235,6359958649 Millisekunden

0
Morg.
<?php foreach($have_comments as $key => $page_comment): ?>
    <?php echo $page_comment;?>
    <?php if($key+1<count($have_comments)): ?> 
        <?php echo ', '; ?>
    <?php endif;?>
<?php endforeach;?>
0
Zarpele

Sie können dies auch versuchen, um Ihre Abfrage zu stellen ... hier mit INSERT dargestellt

<?php
 $week=array('one'=>'monday','two'=>'tuesday','three'=>'wednesday','four'=>'thursday','five'=>'friday','six'=>'saturday','seven'=>'sunday');
 $keys = array_keys($week);
 $string = "INSERT INTO my_table ('";
 $string .= implode("','", $keys);
 $string .= "') VALUES ('";
 $string .= implode("','", $week);
 $string .= "');";
 echo $string;
?>
0
Mark

Ich persönlich benutze diese Art von Konstruktion, die eine einfache Verwendung mit html <ul> und <li> Elementen ermöglicht: einfach die Gleichheit für eine andere Eigenschaft ändern ...

Das Array darf keine falschen Elemente enthalten, sondern alle anderen Elemente, die in das falsche Boolean umgewandelt werden.

$table = array( 'a' , 'b', 'c');
$it = reset($table);
while( $it !== false ) {
    echo 'all loops';echo $it;
    $nextIt = next($table);
    if ($nextIt === false || $nextIt === $it) {
            echo 'last loop or two identical items';
    }
    $it = $nextIt;
}
0
MUY Belgium

Versuchen Sie diese einfache Lösung

$test = ['a' => 1, 'b' => 2, 'c' => 3];

$last_array_value = end($test);

foreach ($test as $key => $value) {
   if ($value === $last_array_value) {
      echo $value; // display the last value  
   } else {
     echo $value; // display the values that are not last elements 
   }
}
0
1247p