Question comment ignorer des éléments dans la boucle foreach


Je veux ignorer certains 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?


19
2018-02-21 23:56


origine


Réponses:


Cinq solutions viennent à l'esprit:

Adressage double via array_keys

Le problème avec les boucles est que les clés peuvent être des chaînes ou non 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 des enregistrements avec foreach

Je ne crois pas que ce soit un bon moyen de le faire (sauf si vous avez des tableaux LARGE et que vous les tranchez ou que vous générez un tableau de clés utiliserait une grande quantité de mémoire, ce qui n'est pas le cas), mais peut-être 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

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

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


En utilisant next()

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

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

btw: J'aime beaucoup les hakre.


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
2018-02-22 00:27



$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

  /* php code to execute if record 21+ */
}

13
2018-02-21 23:59



si vous voulez ignorer certains index, créez un tableau avec index sauté et vérifiez par in_array fonction à l'intérieur du foreach boucle si match alors il sera sauter.

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
2018-05-06 05:50



Vous n'avez pas dit ce que sont les "enregistrements", alors je ne 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 en PHP


3
2018-02-22 00:05



Je ne sais pas pourquoi vous utiliseriez un foreach pour ce but, et sans votre code, il est difficile de dire si c'est la meilleure approche. Mais, en supposant qu'il y ait une bonne raison de l'utiliser, voici la plus petite version que je puisse imaginer:

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

    // rest of foreach loop goes here
}

le continue provoque la foreach pour revenir au début et passer à l'élément suivant du tableau. Il est extrêmement utile de ne pas tenir compte des parties d’un tableau que vous ne souhaitez pas traiter dans un foreach boucle.


1
2018-02-22 00:10



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

C'est mieux qu'une boucle foreach car elle ne fait que parcourir les éléments souhaités. Demandez si vous avez des questions


0
2018-02-22 00:00



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

L'élément serait la valeur actuelle de l'index. L'indice augmente à chaque tour de la boucle. IE 0,1,2,3,4,5; array [index];


0
2018-01-31 06:57