Intereting Posts
Как получить данные из базы данных и отобразить их на PHP? Как использовать разрывы строк в Flex с помощью строки PHP Я не могу получить доступ к XAMPP phpMyAdmin; он говорит: Ошибка MySQL: Документация Не удается подключиться: неверные настройки Xdebug успешно подключается к клиентам DBGP, но не останавливается на контрольных точках Как включить расширение php с помощью `phpize`? Проверить, открыт ли порт и перенаправляется с помощью PHP Как я могу получить параметры из Behat.yml в php-файл? Сохраненная процедура вызывает «Команды не синхронизированы» в следующем запросе Функция curl_init () не работает Получить идентификатор корзины товаров на странице WooCommerce на выводе, отображать изображения продуктов Magento: блокировка блокировки прекращает отображение phtml Несколько видов просмотра Codeigniter в одном представлении Вывод элементов массива случайным образом с помощью PHP PHP – функция GetSQLValueString PHPExcel создает «нечитаемый контент»

как пропустить элементы в цикле foreach

Я хочу пропустить некоторые записи в цикле foreach.

Например, в цикле имеется 68 записей. Как я могу пропустить 20 записей и начать с записи № 21?

На ум приходят пять решений:

Двойная адресация через array_keys

Проблема с циклами в том, что ключи могут быть строками или не продолжать номера, поэтому вы должны использовать «двойную адресацию» (или «поиск таблицы», вызывать ее как угодно) и обращаться к массиву через массив своих ключей.

 // 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 } 

Пропуск записей с помощью foreach

Я не считаю, что это хороший способ сделать это (за исключением случая, когда у вас есть 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; массив [индекс];