简体   繁体   English

如何跳过foreach循环中的元素

[英]how to skip elements in foreach loop

I want to skip some records in a foreach loop. 我想在foreach循环中跳过一些记录。

For example, there are 68 records in the loop. 例如,循环中有68条记录。 How can I skip 20 records and start from record #21? 如何跳过20条记录并从记录#21开始?

Five solutions come to mind: 我想到了五种解决方案:

Double addressing via array_keys 通过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. for循环的问题在于键可能是字符串,也可能不是连续数字,因此必须使用“双重寻址”(或“表查找”,随意调用它)并通过其数组键访问数组。

// 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 使用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: :) 我不相信这是一个很好的方法来做到这一点(除了你有LARGE数组并切片或生成密钥数组将使用大量内存的情况,其中68绝对不是),但也许它会工作::)

$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. 只需得到一块数组并在正常的foreach循环中使用它。

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


Using next() 使用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 ): 如果你可以将内部数组指针设置为21(假设在之前的foreach循环中有break, $array[21]不起作用,我检查过:P)你可以这样做(如果数据在array === false ):

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

btw: I like hakre's answer most. 顺便说一下:我最喜欢hakre的回答。


Using ArrayIterator 使用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
}
$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

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

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. 如果想跳过某个索引,然后创建一个跳过索引的数组,并在foreach循环内检查in_array函数,如果匹配则将跳过。

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
}

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): 你还没有告诉什么是“记录”,其实就是这样,我不知道,我想一个RecordIterator可用的(如果不是,很可能有一些可用的其他配件迭代器):

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

The answer here is to use foreach with a LimitIterator . 这里的答案是使用foreachLimitIterator

See as well: How to start a foreach loop at a specific index in PHP 请参阅: 如何在PHP中的特定索引处启动foreach循环

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. 我不确定为什么你会使用foreach来实现这个目标,如果没有你的代码,很难说这是否是最好的方法。 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. continue使foreach跳回到开头并继续到数组中的下一个元素。 It's extremely useful for disregarding parts of an array which you don't want to be processed in a foreach loop. 对于忽略不希望在foreach循环中处理的数组部分非常有用。

    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; IE 0,1,2,3,4,5; array[index]; 阵列[指数];

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

This is better than a foreach loop because it only loops over the elements you want. 这比foreach循环更好,因为它只遍历你想要的元素。 Ask if you have any questions 问你是否有任何问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM