6
$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   var_dump($animal);
   next($animals);
}

上記のコードは、猫、犬、馬、象を出力します。next関数はの内部ポインタを移動する必要があると思った$animalsので、代わりに次の出力を取得する必要があります:cat、horse。

$ animalの内部ポインターを前方(および後方)に移動させて、foreachで影響を受けるようにするにはどうすればよいですか?

編集1:

マニュアルから:

foreachは内部配列ポインターに依存しているため、ループ内でポインターを変更すると、予期しない動作が発生する可能性があります。

それにもかかわらず、私はこれが私がしなければならないことだと思います。

編集2:

「あなたの常識」のリンクに従って、私は私の問題のより詳細な説明を提供します。これがいくつかの疑似コードです:

array $foos;

start loop of $foos
 - do thing #1
 - do thing #2
 - do thing #3
 - keep doing thing #3 while the current value of $foos in the loop meets a certain criteria
loop

実行がループの先頭に戻ると、#3によってアクセスされた最後の配列から続行する必要があります。配列は連想的であるため、for ($i = 0 ...アプローチは機能しないことに注意してください。

4

6 に答える 6

10

ArrayIteratorドキュメント であるseekableドキュメントを作成するだけです。

これはイテレータであるため、反復しながら位置 を変更できます。これは基本的な例です。

foreach ($iterator as $current) {
    $iterator->next();
}

それはあなたが箱から出して必要なすべてを提供するはずです。そうでない場合は、自分のニーズを自分でドキュメントにカプセル化することもできます。Iterator

于 2012-05-06T20:03:57.083 に答える
8

foreach直接ポインタアクセスと混同しないでください。配列内を移動したい場合はforeach、をCスタイルに置き換えてforください。上部の方が言葉遣いがありますが、foreachケースと同じループ本体で動作しますが、内部ポインターをいじって目的の結果を得ることができるという違いがあります。

$animals = array('cat', 'dog', 'horse', 'elephant');
for ($animal = current($animals), $index = key($animals); 
       $animal; 
       $animal = next($animals), $index = key($animals)) {
  print "$index:";
  var_dump($animal);
  next($animals);
} 

出力:

0:string(3) "cat"
2:string(5) "horse"

foreach配列内を実際に前後に移動しているときのように、単純な反復構造を使用することは非常に誤解を招きます。上記のforループはこの点で優れていますが、それほどではありません。whileループ本体にすべての詳細が明示的に記述されているループが最良の選択かもしれません。

于 2012-05-05T04:34:52.717 に答える
6

Markのソリューションはかなり近いですが、配列に0、false、""などの値が含まれている場合は失敗します。これらの値は2番目のforループ式でfalseと評価されます。

このソリューションはすべてのアレイで機能し、forループの「精神」に少し近いものです。最初のループ式のreset()は、foreachの場合のように、配列の先頭から開始することを保証します。forループの2番目の式は、配列ポインターが指す要素が存在するかどうかを評価する必要があります。key()は、配列ポインタが配列の終わりを超えている場合、または配列が空の場合にnullを返します。3番目の式は、各反復の終わりに配列ポインターを進めます。

$animals = array('cat', 'dog', 'horse', 'elephant');
for (reset($animals); key($animals) !== null; next($animals)) {
    $animal = current($animals);
    var_dump($animal);
    next($animals);
}

これは以下を出力します:

string(3) "cat"
string(5) "horse"
于 2012-12-21T01:22:51.097 に答える
1

価値&を高める

foreach ($variable as $key => &$value) {

}

今アドレス$valueへの参照$variable[$key]

于 2014-08-07T14:44:29.353 に答える
0

彼は要素をスキップしたいだけなので、foreach内のif句と組み合わせて「continue」を使用できます。

$skip=array ('dog', 'elephant');
$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   if (in_array($animal, $skip)) {
       continue;
   }
   var_dump($animal);
}

これは出力します:

string(3) "cat" 
string(5) "horse"

同じ効果で続行せずにVariante2:

$skip=array ('dog', 'elephant');
$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   if (!in_array($animal, $skip)) {
        var_dump($animal);
   }

}
于 2014-04-02T08:26:57.550 に答える
-1

foreachループの最後にポインターを手動でインクリメントする必要はありません。自動的にインクリメントされます。次のもの以外は必要ありません。

foreach($animals as $animal) {
    var_dump($animal)
}
于 2012-05-05T04:36:18.507 に答える