foreachインデックスを見つける方法は?


490

foreachインデックスを見つけることは可能ですか?

for、次のようにループ:

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i インデックスを提供します。

forループを使用する必要がありforeachますか、それともループ内のインデックスを取得する方法はありますか?

回答:


909
foreach($array as $key=>$value) {
    // do stuff
}

$key$array要素のインデックスです


2
インデックスによるOPの意味によって異なります。<?$ a = array(3,5、 'xx'、4312、 'sasas'); unset($ a [3]); foreach($ a as $ k => $ v)print "\ $ k = $ k and \ $ v = $ v"; ?>
Milen A. Radev

9
間違いなく、この質問はそれほど具体的ではありません。OPが$ key => $ value構文をほとんど認識していないことを意味します
Owen

38
まあこれは実際には正しいですが、キーも文字列にすることができるので、受け入れられた答えではないはずです。あなたは$myarr['foo'] = 'bar';この方法を失敗すると言います
Toskan

12
@Bisonあなたはそれが失敗しないという意味で正しいです。しかし、それはOPの質問に準拠していません。彼はn番目の要素のような数値を探しています。
Toskan 2014

3
@Toskanが言うように、これは受け入れられる答えではありません。ループの外で変数を作成し、そこからカウントして、vatiable++;反復ごとに変数を増やす方が良いと思います。従来の方法ですが、常に機能しています。
Jomar Sevillejo、2015年

172

foreachforループスルーで増分されるフィールドなど、ハックをに入れることができます。これは、数値でインデックス付けされた配列でループが提供するものとまったく同じです。このようなフィールドは、手動の管理(増分など)を必要とする疑似インデックスになります。

A foreachはあなたの$key価値の形であなたのインデックスを与えるので、そのようなハックは必要ないはずです。

たとえば、 foreach

$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}

127
ループで値を増加させることは、「ハック」とは言えません。
Thomas McCabe 2013年

17
@ThomasMcCabeループのコア使用の1つであるとさえ言うかもしれません。
Byson

26

key()現在のキーを見つけるために任意の配列を呼び出すことができることに注意してください。ご想像のとおりcurrent()、現在の値を返しnext()、配列のポインタを次の要素に移動します。


これは、プレーンな古いPHPの連想配列を使用して、Iterableインターフェースを介して公開されるデータを格納する場合に役立ちます(ループ内の場所を追跡する必要がある場合)。
Peter

2
代替案の+1ですが、すべての反復での関数呼び出しは、事前に割り当てられた変数を使用する(つまり、$keyfrom を使用する$key=>$value)よりも少し重いです。
Armfoot

20

オーウェンは良い答えを持っています。キーだけが必要で、配列を使用している場合も、これが役立ちます。

foreach(array_keys($array) as $key) {
//  do stuff
}

4
そして、あなたは、インデックスが必要な場合は、foreach(array_keys($array) as $index=>$key)
レオ

14

$iループの外側で作成し、ループ$i++の下部で行うことができます。


16
このアプローチは、反復配列の現在のインデックスではなく、ループの現在の反復を提供することに注意することが重要です。
Peter Bailey、

8

これらの2つのループは同等です(もちろん、安全レールを除外します)。

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

例えば

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}

17
連想配列ではない
JoeCortopassi


5

ジョナサンは正しいです。PHP配列は、キーを値にマッピングするマップテーブルとして機能します。次のように配列が定義されている場合、インデックスを取得できる場合があります。

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

あなたの出力は

2
5

その場合、配列内の各要素には既知のインデックスがありますが、次のようなことをすると

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

出力はありません。これは、PHPの配列がほとんどの言語のように線形構造ではないために発生します。それらは、すべての格納された値のキーを持つ場合と持たない場合があるハッシュテーブルに似ています。したがって、配列が定義されている場合にのみインデックスがあるため、foreachはそれらをクロールするためにインデックスを使用しません。インデックスが必要な場合は、配列が完全に定義されていることを確認してから、それらをクロールし、forループを使用します。


はい。これがPHPで、インデックスではなくキーで「配列を結合」する必要がある理由です。array_map(func、$ a、$ b)も参照してください。
Peter Krauss 2013年

Ops、親愛なる読者、@ TheBrawnyManは、あなたの例がarray_push()バグ(!)のようなものであることも覚えておいてください。推奨は使用することです$var[] = 10;(ガイドのPHPリンクを参照)。したがって、2番目のforループは期待される結果を出力します。
ピータークラウス2013年

4

PHP配列には内部ポインターがあるので、これを試してください:

foreach($array as $key => $value){
   $index = current($array);
}

私には問題なく動作します(ただし、非常に予備的にテストされています)。


1

私は通常、連想配列を操作するときにこれを行います。

foreach ($assoc_array as $key => $value) {
 //do something
}

これは、非連想配列でもうまく機能します。$ keyはインデックス値になります。必要に応じて、これも行うことができます。

foreach ($array as $indx => $value) {
  //do something
}

4
「代替案」とは何ですか?変数名以外は同じですよね?最後の文章とコードブロックが不要であるので、私は言うだろう-それは何もしなければそれだけで混乱...
Dennis98

@ Dennis98違いは、1つは入力として連想配列を持ち、もう1つは数値配列を持つことです。私は答えがもう少し冗長であった方がいいと思いますが。
I_ATE_YOUR_WORK_FILES 2018

0

これを追加したいのですが、laravelでこれを使用して、テーブルにインデックスを付けます。

  • $ loop-> index
  • また、++ $ loopを使用して1から開始するように事前インクリメントします。

私のコード:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

この質問はララヴェルには求められませんでした。この$loop変数は一般的なPHPに要求されるため、使用できません。
Özgür缶Karagöz

0

同じ方法でforeachインデックスと値を使用する必要があったとき、私はこの方法で解決しました:

$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {

  echo $letter; //Here $letter content is the actual index
  echo $array[$letter]; // echoes the array value

}//foreach

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.