Foreach endeksi nasıl bulunur?


490

foreachDizini bulmak mümkün müdür ?

foraşağıdaki gibi bir döngüde:

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

$i size endeksi verecektir.

forDöngüyü kullanmak zorunda mıyım yoksa indeksi foreachdöngüye almanın bir yolu var mı?

Yanıtlar:


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

$keyher $arrayöğenin dizinidir


2
OP'nin dizine göre ne anlama geldiğine bağlıdır: <? $ a = dizi (3,5, 'xx', 4312, 'sasas'); sertleşmemiş ($ a [3]); foreach ($ a olarak $ k => $ v) "\ $ k = $ k ve \ $ v = $ v" yazdır; ?>
Milen A. Radev

9
kesinlikle, bu soru çok spesifik değil, ben OP büyük ölçüde $ anahtar => $ değer sözdizimi farkında değildi anlamına aldı
Owen

38
aslında bu doğru, ama kabul edilen cevap olmamalı, çünkü anahtar da bir dize olabilir. Diyelim ki $myarr['foo'] = 'bar';bu yöntem başarısız oluyor
Toskan

12
@ Bizon başarısız olmadığı anlamında haklısın. Ancak OP sorusuna uymuyor. N'inci element gibi sayısal değerler arıyor.
Toskan

3
@Toskan'ın dediği gibi, bu kabul edilen cevap olmamalı. Döngünün dışında bir değişken oluşturmak ve oradan saymak vatiable++;, her yinelemede onu artırmak daha iyi olduğunu düşünüyorum . Geleneksel yol, ama her zaman çalıştı.
Jomar Sevillejo

172

Her bir geçişte foreachartırılmış bir alan gibi bir kesmek koyabilirsiniz , bu da fordöngünün size sayısal olarak dizine alınmış bir dizide tam olarak verdiği şeydir . Böyle bir alan, manuel yönetime (artışlar, vb.) İhtiyaç duyan bir sahte dizin olacaktır.

A foreach, endeksinizi $keydeğeriniz şeklinde verecektir , bu nedenle böyle bir hack gerekli değildir.

örneğin, bir 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
Bir döngüde artırılmış bir değere sahip olmak neredeyse bir 'hack'tir.
Thomas McCabe

17
@ThomasMcCabe Bir döngü için temel kullanımlardan biri olduğunu bile söyleyebiliriz.
Byson

26

key()Geçerli anahtarı açık bulmak için herhangi bir diziyi çağırabileceğinizi belirtmek gerekir . Tahmin edebileceğiniz gibi current(), geçerli değeri döndürür next()ve dizinin işaretçisini bir sonraki öğeye taşır.


Yinelenebilir arabirimle (döngüde nerede olduğunuzu takip etmeniz gereken yerlerde) açıklanacak verileri depolamak için eski bir PHP ilişkisel dizisi kullanmak istiyorsanız bu yararlı olacaktır.
Peter

2
Alternatif olarak, ama her tekrarında bir işlev çağrısı +1 biraz daha ağır (yani kullanılarak önceden atanmış değişkenleri kullanarak daha $keygelen $key=>$valueAncak, düşük performans basit bir döngüde / belirgin olmayan bir algılanabilir bahis ...).
Armfoot

20

Owen'ın iyi bir cevabı var. Sadece anahtarı istiyorsanız ve bir dizi ile çalışıyorsanız, bu da yararlı olabilir.

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

4
Ve dizine ihtiyacınız varsa foreach(array_keys($array) as $index=>$key).
Leo

14

$iDöngünün dışında oluşturabilir ve döngünün $i++alt kısmında yapabilirsiniz .


16
Bu yaklaşımın yinelenen dizinin geçerli dizinini DEĞİL, döngünün geçerli yinelemesini verdiğine dikkat etmek önemlidir.
Peter Bailey

8

Bu iki döngü eşdeğerdir (elbette güvenlik korkuluklarını bar):

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

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

Örneğin

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

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



5

Jonathan doğrudur. PHP dizileri anahtarları değerlerle eşleyen bir harita tablosu işlevi görür. bazı durumlarda diziniz tanımlanmışsa, örneğin

$var = array(2,5);

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

çıktınız olacak

2
5

bu durumda dizideki her öğenin bilinir bir dizini vardır, ancak aşağıdaki gibi bir şey yaparsanız

$var = array_push($var,10);

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

hiç çıktı almazsınız. Bunun nedeni PHP'deki dizilerin çoğu dilde olduğu gibi doğrusal yapı olmamasıdır. Daha çok, depolanan tüm değerler için anahtarları olabilecek veya içermeyecek karma tablolar gibidir. Bu nedenle foreach, yalnızca dizi tanımlandıysa bir dizine sahip oldukları için üzerlerinde tarama yapmak için dizinler kullanmaz. Bir dizine sahip olmanız gerekiyorsa, dizilerinizi taramadan önce dizilerinizin tam olarak tanımlandığından emin olun ve for döngüsü kullanın.


Evet, bu yüzden PHP'de dizinlere göre değil, anahtarlara "dizilere katılmalıyız" ... Ayrıca bkz. Array_map (func, $ a, $ b).
Peter Krauss

Ops, sevgili okuyucu ve @TheBrawnyMan, örneğinizin bir array_push () hatası (!) Gibi olduğunu da unutmayın . Tavsiye kullanmaktır $var[] = 10;(rehberlik için PHP bağlantısına bakın), böylece ikinci fordöngü beklenen sonuçları verir.
Peter Krauss

4

PHP dizilerinin dahili işaretçileri vardır, bu yüzden şunu deneyin:

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

Benim için iyi çalışıyor (sadece çok ön test olsa da).


1

Normalde ilişkilendirilebilir dizilerle çalışırken bunu yaparım:

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

Bu ilişkisel olmayan dizilerde de işe yarayacaktır. $ anahtarı dizin değeri olacaktır. İsterseniz bunu da yapabilirsiniz:

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

4
'Alternatif' ne işe yarar? Değişken isimlerinin yanı sıra aynı olduğunu biliyor musunuz? Yani son cümle ve kod bloğu gereksiz, diyebilirim ki - eğer
kafa

@ Dennis98 Fark, bunlardan birinin giriş olarak ilişkilendirilebilir bir diziye sahip olması ve diğerinin sayısal diziye sahip olmasıdır. Her ne kadar cevap biraz daha ayrıntılı olsaydı daha iyi olurdu.
I_ATE_YOUR_WORK_FILES

0

Bunu eklemek istiyorum, ben sadece benim tablo dizin için laravel kullandım:

  • $ Loop-> index ile
  • Ben de başlamak için ++ $ döngü ile preincrement 1

Kodum:

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

Bu soru laravel için sorulmadı. $loopGenel PHP istedi çünkü değişken kullanılan olamaz.
Özgür Can Karagöz

0

Ben aynı şekilde foreach endeksi ve değeri kullanmak zorunda kaldı, bu şekilde çözüldü:

$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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.