【问题标题】:how to skip elements in foreach loop如何跳过foreach循环中的元素
【发布时间】:2012-03-12 07:58:12
【问题描述】:

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

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

【问题讨论】:

  • 你能显示你的代码吗?如果foreach 实际上不是for each,为什么还要特别注意它?
  • 有多种方法可以实现这一点,但您没有显示任何代码。当您谈论记录时,通常最好的办法是使用 LIMIT 更改 SQL 查询。
  • 可能想在此处使用for 循环。然后,您可以在for ($i = 20 ... ) 部分设置一个起点。

标签: php for-loop


【解决方案1】:

想到五个解决方案:

通过 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 循环中,内部有 break,$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
}

【讨论】:

    【解决方案2】:
    $i = 0;
    foreach ($query)
    {
      if ($i++ < 20) continue;
    
      /* php code to execute if record 21+ */
    }
    

    【讨论】:

    • @hakre 我会给你 -1 进行编辑以从条件中删除 {}。 :)
    【解决方案3】:

    如果想跳过某些索引,则创建一个带有跳过索引的数组,并通过foreach 循环内的in_array 函数检查,如果匹配则将被跳过。

    示例:

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

    【讨论】:

    • 我应该使用索引还是可以使用值本身?例如: if(in_array($key, array('Hello world5'))){ continue;该示例是为了以防我只想从记录中跳过一个..
    【解决方案4】:

    您还没有告诉“记录”实际上是什么,所以我不知道,我假设 有一个 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

    【讨论】:

    • @webbiedave:该类型/名称堪称典范。如果$records 实际上只是一个数组,那么它将是ArrayIterator。但是 TS 没有提供任何信息记录是什么(只告诉它是你可以 foreach 的东西,它可以是一个对象、一个数组或一些 *Iterator)。
    【解决方案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 循环要好,因为它只循环你想要的元素。 有什么问题可以问

      【讨论】:

      • 假设索引是连续的。可能需要先运行array_values
      【解决方案7】:
          array.forEach(function(element,index){
              if(index >= 21){
                  //Do Something
              }
          });
      

      元素将是索引的当前值。 索引随着循环的每一圈而增加。 即 0、1、2、3、4、5; 数组[索引];

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 1970-01-01
        • 2012-03-02
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 2021-02-25
        • 1970-01-01
        相关资源
        最近更新 更多