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?

pengguna18334
sumber

Jawaban:

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

$keyadalah indeks dari setiap $arrayelemen

Owen
sumber
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++;
}
ConroyP
sumber
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.

Bailey Parker
sumber
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
}
Sakit kepala
sumber
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.

Ólafur Waage
sumber
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;
}
Trev
sumber
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

Mikel Williams
sumber
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.

Pria Berotot
sumber
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).

sth
sumber
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
}
Randy Greencorn
sumber
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
Taranis
sumber
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
Carlos Cavalchuki
sumber
-1
foreach(array_keys($array) as $key) {
//  do stuff
}
gdmanandamohon
sumber