web-dev-qa-db-ja.com

foreachループで要素をスキップする方法

Foreachループでいくつかのレコードをスキップしたいです。

たとえば、ループには68個のレコードがあります。 20個のレコードをスキップして、レコード#21から開始するにはどうすればよいですか?

23
Utku Dalmaz

5つのソリューションが思い浮かびます。

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でレコードをスキップする

私はこれがこれを行うには良い方法だとは思いません(大規模な配列があり、それをスライスしたり、キーの配列を生成すると大量のメモリを使用する場合を除きますが、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
}
_
36
Vyktor
$i = 0;
foreach ($query)
{
  if ($i++ < 20) continue;

  /* php code to execute if record 21+ */
}
15
Mat Taylor

いくつかのインデックスをスキップしたい場合は、スキップされたインデックスで配列を作成し、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
}
5

あなたは実際に「レコード」が何であるかを言っていないので、私は知らないが、私はそこにあると仮定するisRecordIteratorが利用できる(そうでない場合は、他の適切なイテレータが利用できる可能性があります):

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

ここでの答えは、 foreachLimitIteratorを使用することです。

参照: PHPの特定のインデックスでforeachループを開始する方法

3
hakre

この目標にforeachを使用する理由がわかりません。コードがなければ、これが最良のアプローチであるかどうかを判断するのは困難です。しかし、それを使用する正当な理由があると仮定すると、ここに私の頭の中で考えられる最小のバージョンがあります:

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

    // rest of foreach loop goes here
}

continueにより、foreachは先頭にスキップして、配列内の次の要素に移動します。 foreachループで処理したくない配列の部分を無視するのに非常に便利です。

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

要素は、インデックスの現在の値になります。ループを回るたびにインデックスが増加します。 IE 0,1,2,3,4,5; array [index];

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

これは、必要な要素のみをループするため、foreachループよりも優れています。質問があるかどうか尋ねる

0
jakx