Я хочу пропустить некоторые записи в цикле foreach.
Например, в цикле имеется 68 записей. Как я могу пропустить 20 записей и начать с записи № 21?
На ум приходят пять решений:
Проблема с циклами в том, что ключи могут быть строками или не продолжать номера, поэтому вы должны использовать «двойную адресацию» (или «поиск таблицы», вызывать ее как угодно) и обращаться к массиву через массив своих ключей.
// 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 }
Я не считаю, что это хороший способ сделать это (за исключением случая, когда у вас есть LARGE-массивы и нарезание его или создание массива ключей будет использовать большой объем памяти, 68 из которых окончательно нет), но, возможно, это будет Работа: 🙂
$i = 0; foreach( $array as $key => $item){ if( $i++ < 21){ continue; } echo $item . "\n"; }
Просто получите кусок массива и используйте его в обычном цикле foreach.
$sub = array_slice( $array, 21, null, true); foreach( $sub as $key => $item){ echo $item . "\n"; }
next()
Если вы можете настроить указатель внутреннего массива на 21 (скажем, в предыдущем цикле foreach с перерывом внутри, $array[21]
не работает, я проверил: P) вы могли бы сделать это (не будет работать, если данные в array === false
):
while( ($row = next( $array)) !== false){ echo $row; }
Кстати: Мне больше нравится ответ Хакре.
ArrayIterator
Вероятно, изучение документации – лучший комментарий для этого.
// 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+ */ }
если вы хотите пропустить некоторый индекс, тогда создайте массив с пропущенным индексом и проверьте функцию in_array
внутри цикла foreach
если он совпадает, тогда он будет пропускать.
Пример:
//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 }
Вы не сказали, что такое «записи» на самом деле, так как я не знаю, я предполагаю, что есть доступный RecordIterator
(если нет, вполне вероятно, что есть и другой подходящий итератор):
$recordsIterator = new RecordIterator($records); $limited = new LimitIterator($recordsIterator, 20); foreach($limited as $record) { ... }
Ответ здесь – использовать foreach
с LimitIterator
.
См. Также: Как запустить цикл foreach с определенным индексом в PHP
Я не уверен, почему вы будете использовать foreach
для этой цели, и без вашего кода трудно сказать, является ли это наилучшим подходом. Но, полагая, что есть веская причина использовать его, вот самая маленькая версия, которую я могу придумать с головы:
$count = 0; foreach( $someArray as $index => $value ){ if( $count++ < 20 ){ continue; } // rest of foreach loop goes here }
continue
приводит к тому, что foreach
переходит к началу и переходит к следующему элементу массива. Это чрезвычайно полезно для игнорирования частей массива, которые вы не хотите обрабатывать в цикле foreach
.
for($i = 20; $i <= 68; $i++){ //do stuff }
Это лучше, чем цикл foreach, потому что он только перебирает элементы, которые вы хотите. Спросите, есть ли у вас какие-либо вопросы
array.forEach(function(element,index){ if(index >= 21){ //Do Something } });
Элементом будет текущее значение индекса. Индекс увеличивается с каждым поворотом по петле. IE 0,1,2,3,4,5; массив [индекс];