php - tag - como saltar elementos en el bucle foreach
the_tags wordpress (7)
Cinco soluciones vienen a la mente:
Doble direccionamiento a través de array_keys
El problema con los bucles for es que las claves pueden ser cadenas o no números continuos, por lo tanto, debe usar "direccionamiento doble" (o "búsqueda de tabla", llámelo como desee) y acceder a la matriz a través de una matriz de sus claves.
// 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
}
Saltar registros con foreach
No creo que esta sea una buena forma de hacerlo (excepto en el caso de que tengas ARRILLOS GRANDES y cortarlos o generar un conjunto de claves utilizaría una gran cantidad de memoria, lo que definitivamente no es 68), pero quizás trabajo: :)
$i = 0;
foreach( $array as $key => $item){
if( $i++ < 21){
continue;
}
echo $item . "/n";
}
Usando el segmento de matriz para obtener la subparte o matriz
Simplemente obtenga un trozo de matriz y úselo en el bucle foreach normal
$sub = array_slice( $array, 21, null, true);
foreach( $sub as $key => $item){
echo $item . "/n";
}
Usando next()
Si pudiera configurar el puntero de matriz interno a 21 (digamos que en el bucle anterior foreach con ruptura interna, $array[21]
no funciona, verifiqué: P) podría hacer esto (no funcionará si los datos están array === false
):
while( ($row = next( $array)) !== false){
echo $row;
}
por cierto: me gusta más la respuesta de hakre.
Usando ArrayIterator
Probablemente estudiar documentación es el mejor comentario para este.
// 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
}
Quiero saltar algunos registros en un bucle foreach.
Por ejemplo, hay 68 registros en el bucle. ¿Cómo puedo omitir 20 registros y comenzar desde el registro # 21?
No estoy seguro de por qué usaría un foreach
para este objetivo, y sin su código es difícil decir si este es el mejor enfoque. Pero, asumiendo que hay una buena razón para usarlo, aquí está la versión más pequeña que se me ocurre:
$count = 0;
foreach( $someArray as $index => $value ){
if( $count++ < 20 ){
continue;
}
// rest of foreach loop goes here
}
La continue
hace que foreach
vuelva al principio y pase al siguiente elemento de la matriz. Es extremadamente útil para ignorar partes de una matriz que no desea que se procesen en un bucle foreach
.
No ha dicho qué son realmente los "registros", por lo que, como no sé, asumo que hay un RecordIterator
disponible (si no es así, es probable que haya algún otro iterador de ajuste disponible):
$recordsIterator = new RecordIterator($records);
$limited = new LimitIterator($recordsIterator, 20);
foreach($limited as $record)
{
...
}
La respuesta aquí es usar foreach
con un LimitIterator
.
Vea también: Cómo iniciar un bucle foreach en un índice específico en PHP
si desea omitir algún índice, haga una matriz con el índice omitido y verifique mediante la función in_array
dentro del bucle foreach
si coincide, entonces se omitirá.
Ejemplo:
//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
}
for($i = 20; $i <= 68; $i++){
//do stuff
}
Esto es mejor que un bucle foreach porque solo recorre los elementos que desea. Pregunta si tienes alguna duda
array.forEach(function(element,index){
if(index >= 21){
//Do Something
}
});
Elemento sería el valor actual del índice. El índice aumenta con cada vuelta a través del bucle. IE 0,1,2,3,4,5; array [índice];
$i = 0;
foreach ($query)
{
if ($i++ < 20) continue;
/* php code to execute if record 21+ */
}