comment sauter des éléments dans la boucle de foreach

je veux sauter quelques enregistrements dans une boucle de foreach.

Par exemple, il y a 68 enregistrements dans la boucle. Comment puis-je sauter 20 enregistrements et commencer à partir de l'enregistrement n ° 21?

19
demandé sur Stedy 2012-02-22 03:56:26

7 réponses

cinq solutions viennent à L'esprit:

Double adressage via array_keys

le problème avec les boucles for Est que les clés peuvent être des chaînes de caractères ou non continue des nombres, donc vous devez utiliser "double adressage" (ou "table lookup", appelez-le comme vous voulez) et accéder au tableau via un tableau de ses clés.

// 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
}


Sauter enregistrements avec foreach

je ne crois pas que c'est une bonne façon de le faire (sauf que le cas où vous avez de grands tableaux et le découper ou générer des tableaux de clés utiliserait une grande quantité de mémoire, ce qui n'est certainement pas le cas de 68), mais peut-être que cela fonctionnera: :)

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


utilisant la tranche de tableau pour obtenir la sous-partie ou le tableau

il suffit d'obtenir un morceau de tableau et de l'utiliser dans la boucle foreach normale.

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


en utilisant next()

si vous pouvez configurer le tableau interne pointer vers 21 (disons dans la boucle foreach précédente avec break inside,$array[21] ne fonctionne pas, j'ai vérifié :P) vous pouvez faire cela (ne fonctionne pas si les données du tableau === false):

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

btw: j'aime hakre de répondre à la plupart.


en utilisant ArrayIterator

probablement étudier la documentation est le meilleur commentaire pour celui-ci.

// 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
}
34
répondu Vyktor 2013-10-09 11:25:51
$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

  /* php code to execute if record 21+ */
}
14
répondu Mat Taylor 2012-02-22 00:10:30

si vous voulez sauter un index, faites un tableau avec l'index sauté et vérifiez par in_array fonction à l'intérieur de l' foreach boucle si elle correspond alors ce sera skip.

Exemple:

//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
répondu Md. Sahadat Hossain 2015-05-06 05:50:04

vous n'avez pas dit ce qu'est réellement un "enregistrement", donc comme je ne sais pas, je suppose qu'il y en a un RecordIterator disponible (si non, il est probable qu'il y a un autre côté itérateur disponible):

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

La réponse ici est d'utiliser foreach avec un LimitIterator.

Voir aussi: comment lancer une boucle foreach à un index spécifique en PHP

3
répondu hakre 2017-05-23 12:26:14

Je ne sais pas pourquoi vous utiliseriez un foreach pour cet objectif, et sans votre code c'est difficile de dire si c'est la meilleure approche. Mais, en supposant qu'il existe une bonne raison de l'utiliser, voici la version la plus petite, je pense, du haut de ma tête:

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

    // rest of foreach loop goes here
}

continueforeach pour revenir au début et passer à l'élément suivant dans le tableau. Il est extrêmement utile pour négligeant les parties d'un tableau qui vous ne voulez pas être traités dans un foreach boucle.

1
répondu Jazz 2012-02-22 00:10:46
for($i = 20; $i <= 68; $i++){
//do stuff
}

c'est mieux qu'une boucle foreach car elle ne Boucle que les éléments que vous voulez. Demander si vous avez des questions

0
répondu jakx 2012-02-22 00:00:42
    array.forEach(function(element,index){
        if(index >= 21){
            //Do Something
        }
    });

Élément serait la valeur actuelle de l'indice. Indice augmente à chaque tour dans la boucle. IE 0,1,2,3,4,5; tableau[indice];

0
répondu Tony Ventura 2015-01-31 06:57:18