28

I want to skip some records in a foreach loop.

For example, there are 68 records in the loop. How can I skip 20 records and start from record #21?

4
  • 2
    Can you show your code? Why particularly a foreach loop if it isn't actually for each? Commented Feb 21, 2012 at 23:58
  • 5
    There are multiple ways to achieve this, but you have not shown any code. As you talk about records, the best thing normally is to alter the SQL query by using LIMIT. Commented Feb 21, 2012 at 23:59
  • 2
    Same question: How to start a foreach loop at a specific index in PHP Commented Feb 21, 2012 at 23:59
  • Might want to use a for loop here, instead. Then, you can set a starting point in the for ($i = 20 ... ) part. Commented Feb 21, 2012 at 23:59

7 Answers 7

45

Five solutions come to mind:

Double addressing via array_keys

The problem with for loops is that the keys may be strings or not continues numbers therefore you must use "double addressing" (or "table lookup", call it whatever you want) and access the array via an array of it's 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
}


Skipping records with foreach

I don't believe that this is a good way to do this (except the case that you have LARGE arrays and slicing it or generating array of keys would use large amount of memory, which 68 is definitively not), but maybe it'll work: :)

$i = 0;
foreach( $array as $key => $item){
    if( $i++ < 21){
        continue;
    }
    echo $item . "\n";
}


Using array slice to get sub part or array

Just get piece of array and use it in normal foreach loop.

$sub = array_slice( $array, 21, null, true);
foreach( $sub as $key => $item){
    echo $item . "\n";
}


Using next()

If you could set up internal array pointer to 21 (let's say in previous foreach loop with break inside, $array[21] doesn't work, I've checked :P) you could do this (won't work if data in array === false):

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

btw: I like hakre's answer most.


Using ArrayIterator

Probably studying documentation is the best comment for this one.

// 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
}
Sign up to request clarification or add additional context in comments.

Comments

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

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

1 Comment

@hakre I'd give you -1 for edit for removing {} from condition. :)
7

if want to skipped some index then make an array with skipped index and check by in_array function inside the foreach loop if match then it will be skip.

Example:

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

1 Comment

should i have to use the index or i can use the value itself ? for example : if(in_array($key, array('Hello world5'))){ continue; } the example is in case i want skip only one from the records ..
3

You have not told what "records" actually is, so as I don't know, I assume there is a RecordIterator available (if not, it is likely that there is some other fitting iterator available):

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

The answer here is to use foreach with a LimitIterator.

See as well: How to start a foreach loop at a specific index in PHP

1 Comment

@webbiedave: That type/name is exemplary. If $records is in fact just an array, it would be ArrayIterator. But TS has not given any information what records is (only told it's something you can foreach over, which is either an object, an array or some *Iterator).
2

I'm not sure why you would be using a foreach for this goal, and without your code it's hard to say whether this is the best approach. But, assuming there is a good reason to use it, here's the smallest version I can think of off the top of my head:

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

    // rest of foreach loop goes here
}

The continue causes the foreach to skip back to the beginning and move on to the next element in the array. It's extremely useful for disregarding parts of an array which you don't want to be processed in a foreach loop.

Comments

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

This is better than a foreach loop because it only loops over the elements you want. Ask if you have any questions

1 Comment

Assuming the indexes are consecutive. May need to run through array_values first.
0
    array.forEach(function(element,index){
        if(index >= 21){
            //Do Something
        }
    });

Element would be the current value of index. Index increases with each turn through the loop. IE 0,1,2,3,4,5; array[index];

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.