web-dev-qa-db-fra.com

comment ignorer des éléments dans une boucle foreach

Je veux sauter des enregistrements dans une boucle 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?

20
Utku Dalmaz

Cinq solutions me 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 ou non des nombres. Vous devez donc utiliser le "double adressage" (ou "consultation de la table", appelez-le comme vous le souhaitez) 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 des disques avec foreach

Je ne crois pas que ce soit un bon moyen de le faire (sauf que vous ayez de grands tableaux et que vous fassiez des tranches ou que vous génériez un tableau de clés utiliserait une grande quantité de mémoire, ce qui n'est vraiment pas le cas), mais travail: :)

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


Utiliser une tranche de tableau pour obtenir une sous-partie ou un tableau

Obtenez juste un morceau de tableau et utilisez-le dans une boucle foreach normale.

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


Utilisation de next()

Si vous pouviez configurer un pointeur de tableau interne sur 21 (disons dans la boucle foreach précédente avec une rupture dans, $array[21] ne fonctionne pas, j'ai vérifié: P), vous pouvez le faire (cela ne fonctionnera pas si les données du tableau === false):

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

au fait: j'aime surtout la réponse de hakre.


Utilisation de ArrayIterator

Etudier la documentation est probablement 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
}
35
Vyktor
$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

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

si vous voulez ignorer un index, créez un tableau avec un index ignoré et vérifiez par la fonction in_array dans la boucle foreach si elle est identique, elle sera ignorée.

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

Vous n'avez pas dit ce que sont réellement les "enregistrements", alors comme je ne le sais pas, je suppose que est une RecordIterator disponible (sinon, il est probable qu'il existe un autre itérateur approprié):

$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 démarrer une boucle foreach à un index spécifique dans PHP

3
hakre

Je ne suis pas sûr de savoir pourquoi vous utiliseriez une foreach pour cet objectif, et sans votre code, il est difficile de dire si c'est la meilleure approche. Mais, s’il ya une bonne raison de l’utiliser, voici la plus petite version à laquelle je puisse penser:

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

    // rest of foreach loop goes here
}

La continue force la foreach à revenir au début et à passer à l'élément suivant du tableau. C'est extrêmement utile pour ignorer les parties d'un tableau que vous ne voulez pas traiter dans une boucle foreach.

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

L'élément serait la valeur actuelle de index . Index augmente à chaque tour de boucle .

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

C’est mieux qu’une boucle foreach car elle ne fait que boucler sur les éléments que vous voulez.

0
jakx