จะหาดัชนี 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'); ไม่มีการตั้งค่า ($ a [3]); foreach ($ a เป็น $ k => $ v) พิมพ์ "\ $ k = $ k และ \ $ v = $ v"; ?>
Milen A. Radev

9
แน่นอนคำถามนี้ไม่ได้เฉพาะเจาะจงมากผมเอามันหมายความว่าสหกรณ์เป็นส่วนใหญ่ไม่รู้ความสำคัญที่ $ => $ ไวยากรณ์ค่า
โอเว่น

38
อย่างนี้ถูกต้อง แต่ไม่ควรเป็นคำตอบที่ยอมรับเนื่องจากคีย์สามารถเป็นสตริงได้เช่นกัน ว่าคุณทำ$myarr['foo'] = 'bar';วิธีนี้ล้มเหลว
Toskan

12
@ กระทิงคุณถูกต้องในความหมายที่ไม่ล้มเหลว แต่มันล้มเหลวในการปฏิบัติตามคำถาม OP เขากำลังมองหาค่าตัวเลขเช่นองค์ประกอบที่ n
Toskan

3
เช่นเดียวกับ @Toskan กล่าวว่านี่ไม่ควรเป็นคำตอบที่ยอมรับได้ ฉันคิดว่าจะเป็นการดีกว่าที่จะสร้างตัวแปรนอกวงและนับจากที่นั่นเพิ่มขึ้นด้วยvatiable++;การทำซ้ำแต่ละครั้ง วิธีดั้งเดิม แต่ได้ผลเสมอ
Jomar Sevillejo

172

คุณสามารถแฮ็คข้อมูลของคุณforeachได้เช่นเขตข้อมูลที่เพิ่มขึ้นในการเรียกใช้แต่ละครั้งซึ่งเป็นสิ่งที่forลูปให้คุณในอาร์เรย์ที่มีการจัดทำดัชนีตัวเลข เขตข้อมูลดังกล่าวจะเป็นดัชนีเทียมที่ต้องการการจัดการด้วยตนเอง (เพิ่มขึ้น ฯลฯ )

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
การเพิ่มค่าในลูปนั้นแทบจะเป็น 'แฮ็ค'
โทมัส McCabe

17
@ThomasMcCabe One อาจกล่าวได้ว่าเป็นหนึ่งในแกนหลักที่ใช้สำหรับการวนซ้ำ
Byson

26

ควรสังเกตว่าคุณสามารถโทรหาkey()อาร์เรย์ใด ๆ เพื่อหาคีย์ปัจจุบันที่อยู่ใน ในขณะที่คุณสามารถเดาได้ว่าcurrent()จะคืนค่าปัจจุบันและnext()จะย้ายตัวชี้ของอาร์เรย์ไปยังองค์ประกอบถัดไป


สิ่งนี้จะมีประโยชน์หากคุณต้องการใช้อาเรย์แบบเชื่อมโยง PHP แบบเก่าเพื่อจัดเก็บข้อมูลซึ่งจะถูกเปิดเผยผ่านทางส่วนต่อประสาน Iterable (ซึ่งคุณต้องติดตามตำแหน่งที่คุณอยู่ในลูป)
ปีเตอร์

2
+1 สำหรับทางเลือก แต่การเรียกใช้ฟังก์ชั่นในการทำซ้ำทุกครั้งนั้นหนักกว่าการใช้ตัวแปรที่กำหนดไว้ล่วงหน้าเล็กน้อย (เช่นการใช้$keyจาก$key=>$value) ... อย่างไรก็ตามฉันเดิมพันว่าประสิทธิภาพที่ต่ำกว่านั้นไม่สำคัญ / สังเกตได้ในลูปธรรมดา
Armfoot

20

โอเว่นมีคำตอบที่ดี หากคุณต้องการเพียงกุญแจและคุณกำลังทำงานกับอาร์เรย์สิ่งนี้อาจเป็นประโยชน์

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

4
และถ้าคุณต้องการดัชนี, foreach(array_keys($array) as $index=>$key).
Leo

14

คุณสามารถสร้าง$iนอกวงและทำ$i++ที่ด้านล่างของวง


16
สิ่งสำคัญคือให้สังเกตว่าวิธีการนี้ให้การวนซ้ำปัจจุบันของลูปไม่ใช่ดัชนีปัจจุบันของอาร์เรย์ที่วนซ้ำ
Peter Bailey

8

ห่วงสองวงนี้เท่ากัน (ป้องกันความปลอดภัยของราง):

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 ไม่ได้ใช้ดัชนีในการรวบรวมข้อมูลเพราะพวกเขามีดัชนีเฉพาะเมื่อมีการกำหนดอาร์เรย์ หากคุณจำเป็นต้องมีดัชนีตรวจสอบให้แน่ใจว่าอาร์เรย์ของคุณได้รับการกำหนดอย่างสมบูรณ์ก่อนที่จะรวบรวมข้อมูลและใช้สำหรับลูป


ใช่นี่คือเหตุผลว่าทำไมใน PHP เราต้อง "เข้าร่วมอาร์เรย์" โดยใช้คีย์และไม่ทำตามดัชนี ... ดูเพิ่มเติมarray_map (func, $ a, $ b)
Peter Krauss

Ops, ผู้อ่านที่รักและ @TheBrawnyMan โปรดจำไว้ว่าตัวอย่างของคุณเป็นเหมือนข้อผิดพลาดarray_push () การแนะนำอีกครั้งคือการใช้$var[] = 10;(ดูลิงก์ PHP เพื่อเป็นแนวทาง) ดังนั้นการforวนซ้ำครั้งที่สองจะแสดงผลลัพธ์ที่คาดหวัง
Peter Krauss

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 ข้อแตกต่างคือหนึ่งในนั้นมีอาร์เรย์ที่เชื่อมโยงเป็นอินพุตและอีกอันหนึ่งมีอาร์เรย์ที่เป็นตัวเลข แม้ว่าฉันเดาว่ามันจะดีกว่านี้ถ้าคำตอบนั้นละเอียดยิ่งขึ้น
I_ATE_YOUR_WORK_FILES

0

ฉันต้องการเพิ่มสิ่งนี้ฉันใช้สิ่งนี้เป็น laravel เพื่อสร้างดัชนีตารางของฉัน:

  • ด้วย $ loop-> index
  • ฉันยัง preincrement ด้วย ++ $ loop เพื่อเริ่มต้นที่ 1

รหัสของฉัน:

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

คำถามนี้ไม่ได้ถามถึง laravel $loopตัวแปรไม่สามารถนำมาใช้เพราะมันจะถามสำหรับ PHP ทั่วไป
Özgür Can 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.