如何跳过foreach循环中的元素

时间:2012-02-21 23:56:26

标签: php for-loop

我想在foreach循环中跳过一些记录。

例如,循环中有68条记录。如何跳过20条记录并从记录#21开始?

7 个答案:

答案 0 :(得分:36)

我想到了五种解决方案:

通过array_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
}

<小时/>

使用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的回答。


使用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
}

答案 1 :(得分:14)

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

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

答案 2 :(得分:5)

如果想跳过某个索引然后创建一个跳过索引的数组,并在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
}

答案 3 :(得分:3)

你还没有告诉“记录”究竟是什么,所以我不知道,我认为一个RecordIterator可用(如果没有,很可能是一些其他适合的迭代器可用):

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

这里的答案是将foreachLimitIterator一起使用。

请参阅:How to start a foreach loop at a specific index in PHP

答案 4 :(得分:1)

我不确定为什么你会使用foreach来实现这个目标,如果没有你的代码,很难说这是否是最好的方法。但是,假设有充分的理由使用它,这是我能想到的最小版本:

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

    // rest of foreach loop goes here
}

continue导致foreach跳回到开头并继续前进到数组中的下一个元素。对于忽略不希望在foreach循环中处理的数组部分非常有用。

答案 5 :(得分:0)

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

这比foreach循环更好,因为它只会遍历你想要的元素。 询问您是否有任何问题

答案 6 :(得分:0)

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

元素将是索引的当前值。 每次转弯都会使指数增加。 IE 0,1,2,3,4,5; 阵列[指数];

相关问题