web-dev-qa-db-de.com

wie man Elemente in der foreach-Schleife überspringt

Ich möchte einige Datensätze in einer foreach-Schleife überspringen. 

Zum Beispiel befinden sich 68 Datensätze in der Schleife. Wie kann ich 20 Datensätze überspringen und mit Datensatz Nr. 21 beginnen?

20
Utku Dalmaz

Fünf Lösungen kommen in den Sinn:

Doppelte Adressierung über array_keys

Das Problem bei for-Schleifen ist, dass es sich bei den Schlüsseln möglicherweise um Strings handelt oder nicht um fortlaufende Nummern. Daher müssen Sie "double addressing" (oder "table lookup" verwenden, nennen Sie es wie Sie wollen) und auf das Array über ein Array seiner Schlüssel zugreifen.

// Initialize 25 items
$array = range( 1, 25, 1);

// You need to get array keys because it may be associative array
// Or it it will contain keys 0,1,2,5,6...
// If you have indexes staring from zero and continuous (eg. from db->fetch_all)
// you can just omit this
$keys = array_keys($array);
for( $i = 21; $i < 25; $i++){
    echo $array[ $keys[ $i]] . "\n";
    // echo $array[$i] . "\n"; // with continuous numeric keys
}


Überspringen von Datensätzen mit foreach

Ich glaube nicht, dass dies ein guter Weg ist, dies zu tun (außer der Fall, dass Sie LARGE Arrays haben und diese in Scheiben schneiden oder ein Array von Schlüsseln generieren, würde viel Speicherplatz beanspruchen, was definitiv nicht der Fall ist), aber vielleicht ist das der Fall Arbeit: :)

$i = 0;
foreach( $array as $key => $item){
    if( $i++ < 21){
        continue;
    }
    echo $item . "\n";
}


Verwenden von Array-Slice, um einen Sub-Part oder ein Array zu erhalten

Holen Sie sich ein Stück Array und verwenden Sie es in der normalen Foreach-Schleife.

$sub = array_slice( $array, 21, null, true);
foreach( $sub as $key => $item){
    echo $item . "\n";
}


next() verwenden

Wenn Sie den Zeiger für interne Arrays auf 21 einstellen könnten (sagen wir in der vorherigen foreach-Schleife mit break nach innen, $array[21] funktioniert nicht, ich habe geprüft: P), könnten Sie dies tun (funktioniert nicht, wenn Daten im Array === false):

while( ($row = next( $array)) !== false){
  echo $row;
}

Übrigens: Ich mag die Antwort von Hakre am meisten.


ArrayIterator verwenden

Das Studium der Dokumentation ist wahrscheinlich der beste Kommentar für diesen.

// Initialize array iterator
$obj = new ArrayIterator( $array);
$obj->seek(21); // Set to right position
while( $obj->valid()){ // Whether we do have valid offset right now
    echo $obj->current() . "\n";
    $obj->next(); // Switch to next object
}
35
Vyktor
$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

  /* php code to execute if record 21+ */
}
14
Mat Taylor

wenn Sie einen Index überspringen möchten, erstellen Sie ein Array mit einem übersprungenen Index und überprüfen Sie die in_array-Funktion in der foreach-Schleife.

Beispiel:  

//you have an array like that
$data = array(
    '1' => 'Hello world',
    '2' => 'Hello world2',
    '3' => 'Hello world3',
    '4' => 'Hello world4',
    '5' => 'Hello world5',// you want to skip this
    '6' => 'Hello world6',// you want to skip this
    '7' => 'Hello world7',
    '8' => 'Hello world8',
    '9' => 'Hello world8',
    '10' => 'Hello world8',//you want to skip this
);

//Ok Now wi make an array which contain the index wich have to skipped

$skipped = array('5', '6', '10');

foreach($data as $key => $value){
    if(in_array($key, $skipped)){
        continue;
    }
    //do your stuf
}
4

Sie haben nicht gesagt, was "Datensätze" tatsächlich sind, also gehe ich davon aus, dass ist eine RecordIterator verfügbar (falls nicht, ist wahrscheinlich ein anderer passender Iterator verfügbar):

$recordsIterator = new RecordIterator($records);
$limited = new LimitIterator($recordsIterator, 20);
foreach($limited as $record)
{
    ...
}

Die Antwort hier ist die Verwendung von foreach mit einer LimitIterator .

Siehe auch: So starten Sie eine foreach-Schleife an einem bestimmten Index in PHP

3
hakre

Ich bin nicht sicher, warum Sie eine foreach für dieses Ziel verwenden würden, und ohne Ihren Code ist es schwer zu sagen, ob dies der beste Ansatz ist. Angenommen, es gibt einen guten Grund, es zu verwenden, hier ist die kleinste Version, die ich mir aus meinem Kopf vorstellen kann:

$count = 0;
foreach( $someArray as $index => $value ){
    if( $count++ < 20 ){
        continue;
    }

    // rest of foreach loop goes here
}

Die continue bewirkt, dass die foreach an den Anfang zurückspringt und zum nächsten Element im Array weitergeht. Dies ist äußerst nützlich, wenn Sie Teile eines Arrays ignorieren möchten, die nicht in einer foreach-Schleife verarbeitet werden sollen.

1
Jazz
    array.forEach(function(element,index){
        if(index >= 21){
            //Do Something
        }
    });

Element wäre der aktuelle Wert von index . Index steigt mit jeder Umdrehung durch die Schleife . IE 0,1,2,3,4,5; Array [index];

0
Tony Ventura
for($i = 20; $i <= 68; $i++){
//do stuff
}

Dies ist besser als eine foreach-Schleife, da nur die gewünschten Elemente in einer Schleife angezeigt werden

0
jakx