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?
Cinq solutions me viennent à l’esprit:
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
}
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";
}
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";
}
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.
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
}
$i = 0;
foreach ($query)
{
if ($i++ < 20) continue;
/* php code to execute if record 21+ */
}
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
}
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
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
.
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 .
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.