Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Приходят в голову пять решений:

Двойная адресация через 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), вы могли бы сделать это (не будет работать, если данные в массиве === false):

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

btw: Мне больше нравится hakre answer.


Использование 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
}

Ответ 2

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

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

Ответ 3

если вы хотите пропустить некоторый индекс, тогда создайте массив с пропущенным индексом и проверите функцией 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
}

Ответ 4

Вы не сказали, что такое "записи" на самом деле, так как я не знаю, я предполагаю, что существует RecordIterator (если нет, вполне вероятно, что есть и другой подходящий итератор):

$recordsIterator = new RecordIterator($records);
$limited = new LimitIterator($recordsIterator, 20);
foreach($limited as $record)
{
    ...
}

Ответ здесь заключается в использовании foreach с LimitIterator.

Смотрите также: Как запустить цикл foreach по определенному индексу в PHP

Ответ 5

Я не уверен, почему вы используете foreach для этой цели, и без вашего кода трудно сказать, является ли это наилучшим подходом. Но, полагая, что для этого есть веская причина, вот наименьшая версия, которую я могу вспомнить с головы:

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

    // rest of foreach loop goes here
}

continue приводит к тому, что foreach переходит к началу и переходит к следующему элементу массива. Это чрезвычайно полезно для игнорирования частей массива, которые вы не хотите обрабатывать в цикле foreach.

Ответ 6

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

Это лучше, чем цикл foreach, потому что он только перебирает элементы, которые вы хотите. Спросите, есть ли у вас какие-либо вопросы.

Ответ 7

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

Элемент будет текущим значением индекса. Индекс увеличивается с каждым поворотом по петле. IE 0,1,2,3,4,5; массив [индекс];