Bagaimana cara menemukan indeks foreach?


490

Apakah mungkin menemukan foreachindeks?

dalam satu forlingkaran sebagai berikut:

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

$i akan memberi Anda indeks.

Apakah saya harus menggunakan forloop atau adakah cara untuk mendapatkan indeks dalam foreachloop?

Jawaban:


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

$keyadalah indeks dari setiap $arrayelemen


2
Bergantung pada apa yang OP maksudkan dengan indeks: <? $ a = array (3,5, 'xx', 4312, 'sasas'); tidak disetel ($ a [3]); foreach ($ a as $ k => $ v) cetak "\ $ k = $ k dan \ $ v = $ v"; ?>
Milen A. Radev

9
pasti, pertanyaan ini tidak terlalu spesifik, saya menganggap OP sebagian besar tidak menyadari sintaks $ key => $ value
Owen

38
baik ini sebenarnya benar, tetapi tidak boleh menjadi jawaban yang diterima, karena kunci juga bisa menjadi string. mengatakan Anda melakukan $myarr['foo'] = 'bar';metode ini gagal
Toskan

12
@Bison Anda benar dalam arti bahwa itu tidak gagal. Tetapi gagal memenuhi pertanyaan OP. Dia mencari nilai numerik seperti elemen ke-n.
Toskan

3
Seperti yang dikatakan @Toskan, ini bukan jawaban yang diterima. Saya pikir lebih baik hanya membuat variabel di luar loop dan menghitung dari sana, meningkatkannya dengan vatiable++;setiap iterasi. Cara tradisional, tetapi selalu berhasil.
Jomar Sevillejo

172

Anda bisa meletakkan retasan di bidang Anda foreach, seperti bidang yang bertambah pada setiap run-through, yang persis seperti yang fordiberikan loop pada Anda dalam array yang diindeks secara numerik. Bidang seperti itu akan menjadi indeks semu yang membutuhkan manajemen manual (kenaikan, dll).

A foreachakan memberi Anda indeks Anda dalam bentuk $keynilai Anda , jadi peretasan seperti itu tidak perlu dilakukan.

misalnya dalam 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++;
}

128
Memiliki nilai yang bertambah dalam satu lingkaran bukanlah 'retas'.
Thomas McCabe

17
@ThomasMcCabe One bahkan mungkin mengatakan itu adalah salah satu kegunaan inti untuk sebuah loop.
Byson

26

Perlu dicatat bahwa Anda dapat memanggil key()array apa saja untuk menemukan kunci saat ini aktif. Seperti yang dapat Anda tebak, current()akan mengembalikan nilai saat ini dan next()akan memindahkan pointer array ke elemen berikutnya.


Ini harus bermanfaat jika Anda ingin menggunakan array asosiatif PHP lama polos untuk menyimpan data yang akan diekspos melalui antarmuka Iterable (di mana Anda perlu melacak di mana Anda berada dalam satu lingkaran).
Peter

2
+1 untuk alternatifnya, tetapi pemanggilan fungsi di setiap iterasi sedikit lebih berat daripada menggunakan variabel yang ditugaskan sebelumnya (yaitu menggunakan $keydari $key=>$value) ... Namun, saya yakin kinerja yang lebih rendah tidak signifikan / dapat dilihat dalam satu loop sederhana.
Armfoot

20

Owen memiliki jawaban yang bagus. Jika Anda hanya ingin kunci, dan Anda bekerja dengan array ini mungkin juga berguna.

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

4
Dan jika Anda membutuhkan indeks foreach(array_keys($array) as $index=>$key),.
Leo

14

Anda dapat membuat di $iluar loop dan lakukan $i++di bagian bawah loop.


16
Penting untuk dicatat bahwa pendekatan ini memberikan iterasi loop saat ini, BUKAN indeks saat ini dari array iterated.
Peter Bailey

8

Kedua loop ini setara (kecuali tentu saja pagar pengaman):

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

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

misalnya

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

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

17
Tidak jika itu adalah array asosiatif
JoeCortopassi

8

Saya pikir opsi terbaik adalah sama:

foreach ($lists as $key=>$value) {
    echo $key+1;
}

itu mudah dan normal


Bekerja seperti pesona
Steve Nosse

5

Jonathan benar. Array PHP bertindak sebagai kunci pemetaan tabel peta untuk nilai. dalam beberapa kasus Anda bisa mendapatkan indeks jika array Anda didefinisikan, seperti

$var = array(2,5);

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

output Anda akan menjadi

2
5

dalam hal ini setiap elemen dalam array memiliki indeks yang dapat diketahui, tetapi jika Anda kemudian melakukan sesuatu seperti berikut ini

$var = array_push($var,10);

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

Anda tidak mendapatkan hasil. Ini terjadi karena array dalam PHP bukan struktur linier seperti pada kebanyakan bahasa. Mereka lebih seperti tabel hash yang mungkin atau mungkin tidak memiliki kunci untuk semua nilai yang disimpan. Karenanya foreach tidak menggunakan indeks untuk menjelajahinya karena mereka hanya memiliki indeks jika array didefinisikan. Jika Anda perlu memiliki indeks, pastikan array Anda sepenuhnya ditentukan sebelum merangkak di atasnya, dan gunakan untuk loop.


Ya, inilah sebabnya di PHP kita harus "bergabung dengan array" dengan kunci dan bukan dengan indeks ... Lihat juga array_map (func, $ a, $ b).
Peter Krauss

Ops, pembaca yang budiman dan @TheBrawnyMan, ingat juga bahwa contoh Anda seperti bug array_push () (!). Rekomendasi ini adalah untuk digunakan $var[] = 10;(lihat tautan PHP untuk memandu), sehingga forloop kedua menampilkan hasil yang diharapkan.
Peter Krauss

4

Array PHP memiliki pointer internal, jadi coba ini:

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

Berfungsi baik-baik saja untuk saya (hanya diuji secara preliminarily).


1

Saya biasanya melakukan ini ketika bekerja dengan array asosiatif:

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

Ini akan bekerja dengan baik dengan array non-asosiatif juga. $ key akan menjadi nilai indeks. Jika mau, Anda juga dapat melakukan ini:

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

4
Untuk apa 'alternatif' itu? Anda tahu ini sama, di samping nama variabel? Jadi kalimat terakhir dan blok kode tidak perlu, saya akan mengatakan - jika itu melakukan sesuatu itu hanya membingungkan ..
Dennis98

@ Dennis98 Perbedaannya adalah bahwa salah satu dari mereka memiliki array asosiatif sebagai input dan yang lainnya memiliki array numerik. Meskipun saya kira akan lebih baik jika jawabannya sedikit lebih verbose.
I_ATE_YOUR_WORK_FILES

0

Saya ingin menambahkan ini, saya menggunakan ini di laravel untuk mengindeks tabel saya:

  • Dengan $ loop-> index
  • Saya juga preincrement dengan ++ $ loop untuk mulai dari 1

Kode Saya:

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

Pertanyaan ini tidak ditanyakan untuk laravel. The $loopvariabel tidak dapat digunakan karena meminta PHP umum.
Özgür Can Karagöz

0

Saya memecahkan cara ini, ketika saya harus menggunakan indeks dan nilai foreach dalam konteks yang sama:

$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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.