Làm thế nào để tìm chỉ số foreach?


490

Có thể tìm thấy foreachchỉ số?

trong một forvòng lặp như sau:

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

$i sẽ cung cấp cho bạn các chỉ số.

Tôi có phải sử dụng forvòng lặp không hoặc có cách nào để lấy chỉ mục trong foreachvòng lặp không?

Câu trả lời:


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

$keylà chỉ số của từng $arrayyếu tố


2
Phụ thuộc vào ý nghĩa của OP theo chỉ số: <? $ a = mảng (3,5, 'xx', 4312, 'sasas'); bỏ đặt ($ a [3]); foreach ($ a dưới dạng $ k => $ v) in "\ $ k = $ k và \ $ ​​v = $ v"; ?>
Milen A. Radev

9
chắc chắn, câu hỏi này không cụ thể lắm, tôi đã hiểu nó có nghĩa là OP hầu như không biết về cú pháp $ key => $ value
Owen

38
Vâng, điều này thực sự đúng, nhưng không nên là câu trả lời được chấp nhận, vì khóa cũng có thể là một chuỗi. nói rằng bạn thực hiện $myarr['foo'] = 'bar';phương pháp này thất bại
Toskan

12
@Bison bạn đúng theo nghĩa là nó không thất bại. Nhưng nó không tuân thủ câu hỏi OP. Anh ta đang tìm kiếm các giá trị số như phần tử thứ n.
Toskan

3
Giống như @Toskan nói, đây không phải là câu trả lời được chấp nhận. Tôi nghĩ sẽ tốt hơn nếu chỉ tạo một biến ngoài vòng lặp và đếm từ đó, tăng nó với vatiable++;mỗi lần lặp. Cách truyền thống, nhưng luôn luôn làm việc.
Jomar Sevillejo

172

Bạn có thể đặt một bản hack vào foreach, chẳng hạn như một trường tăng dần trên mỗi lần chạy, đó chính xác là những gì forvòng lặp mang lại cho bạn trong một mảng được lập chỉ mục bằng số. Một lĩnh vực như vậy sẽ là một chỉ mục giả cần quản lý thủ công (gia số, v.v.).

A foreachsẽ cung cấp cho bạn chỉ mục của bạn dưới dạng $keygiá trị của bạn , vì vậy việc hack như vậy là không cần thiết.

ví dụ: trong một 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
Có một giá trị tăng lên trong một vòng lặp hầu như không phải là 'hack'.
Thomas McCabe

17
@ThomasMcCabe Một người thậm chí có thể nói đó là một trong những cách sử dụng cốt lõi cho một vòng lặp.
Byson

26

Cần lưu ý rằng bạn có thể gọi key()bất kỳ mảng nào để tìm khóa hiện tại. Như bạn có thể đoán current()sẽ trả về giá trị hiện tại và next()sẽ di chuyển con trỏ của mảng sang phần tử tiếp theo.


Điều này sẽ hữu ích nếu bạn muốn sử dụng một mảng kết hợp PHP cũ đơn giản để lưu trữ dữ liệu sẽ được hiển thị thông qua giao diện Iterable (nơi bạn cần theo dõi xem bạn đang ở đâu trong một vòng lặp).
Peter

2
+1 cho phương án thay thế, nhưng một lệnh gọi hàm trong mỗi lần lặp lại nặng hơn một chút so với sử dụng các biến được gán trước (nghĩa là sử dụng $keytừ $key=>$value) ... Tuy nhiên, tôi cá rằng hiệu suất thấp hơn là không đáng kể / có thể cảm nhận được trong một vòng lặp đơn giản.
Armfoot

20

Owen có một câu trả lời tốt. Nếu bạn chỉ muốn khóa và bạn đang làm việc với một mảng thì điều này cũng có thể hữu ích.

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

4
Và nếu bạn cần chỉ số , foreach(array_keys($array) as $index=>$key).
Leo

14

Bạn có thể tạo $ibên ngoài vòng lặp và làm $i++ở dưới cùng của vòng lặp.


16
Điều quan trọng cần lưu ý là cách tiếp cận này đưa ra vòng lặp hiện tại của vòng lặp, KHÔNG phải là chỉ mục hiện tại của mảng lặp.
Peter Bailey

8

Hai vòng này là tương đương (dĩ nhiên là thanh chắn an toàn):

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

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

ví dụ

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

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

17
Không phải nếu đó là một mảng kết hợp
JoeCortopassi

8

Tôi nghĩ rằng lựa chọn tốt nhất là như nhau:

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

nó dễ dàng và bình thường


Hoạt động như một bùa mê
Steve Nosse

5

Jonathan là chính xác. Các mảng PHP hoạt động như một khóa ánh xạ bảng ánh xạ tới các giá trị. trong một số trường hợp, bạn có thể nhận được một chỉ mục nếu mảng của bạn được xác định, chẳng hạn như

$var = array(2,5);

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

đầu ra của bạn sẽ là

2
5

trong trường hợp đó, mỗi phần tử trong mảng có một chỉ mục có thể biết được, nhưng nếu sau đó bạn làm một cái gì đó như sau

$var = array_push($var,10);

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

bạn không nhận được đầu ra. Điều này xảy ra bởi vì các mảng trong PHP không phải là cấu trúc tuyến tính giống như trong hầu hết các ngôn ngữ. Chúng giống như các bảng băm có thể có hoặc không có khóa cho tất cả các giá trị được lưu trữ. Do đó foreach không sử dụng các chỉ mục để thu thập dữ liệu vì chúng chỉ có một chỉ mục nếu mảng được xác định. Nếu bạn cần phải có một chỉ mục, hãy đảm bảo các mảng của bạn được xác định đầy đủ trước khi thu thập dữ liệu và sử dụng vòng lặp for.


Vâng, đây là lý do tại sao trong PHP, chúng ta phải "nối các mảng" bằng các khóa chứ không phải bằng các chỉ mục ... Xem thêm mảng_map (func, $ a, $ b).
Peter Krauss

Ops, độc giả thân yêu và @TheBrawnyMan, hãy nhớ rằng ví dụ của bạn giống như một lỗi mảng_push () (!). Việc giới thiệu là sử dụng $var[] = 10;(xem liên kết PHP để hướng dẫn), vì vậy forvòng lặp thứ hai cho kết quả mong đợi.
Peter Krauss

4

Mảng PHP có con trỏ nội bộ, vì vậy hãy thử điều này:

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

Hoạt động tốt cho tôi (chỉ thử nghiệm sơ bộ mặc dù).


1

Tôi thường làm điều này khi làm việc với các mảng kết hợp:

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

Điều này sẽ làm việc tốt với các mảng không liên kết quá. $ key sẽ là giá trị chỉ mục. Nếu bạn thích, bạn cũng có thể làm điều này:

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

4
"Sự thay thế" để làm gì? Bạn biết điều này là giống nhau, bên cạnh các tên biến? Vì vậy, câu cuối cùng và khối mã là không cần thiết, tôi nói - nếu nó làm bất cứ điều gì thì nó chỉ gây nhầm lẫn ..
Dennis98

@ Dennis98 Sự khác biệt là một trong số chúng có một mảng kết hợp làm đầu vào và một cái khác có một mảng số. Mặc dù tôi đoán sẽ tốt hơn nếu câu trả lời dài dòng hơn một chút.
I_ATE_YOUR_WORK_FILES

0

Tôi muốn thêm cái này, tôi đã sử dụng cái này trong laravel để chỉ mục bảng của mình:

  • Với chỉ số $ loop->
  • Tôi cũng tạo ra nó với vòng lặp ++ $ để bắt đầu từ 1

Mã của tôi:

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

Câu hỏi này không được hỏi về laravel. Các $loopbiến không thể được sử dụng bởi vì nó được hỏi cho PHP nói chung.
Özgür Can Karagöz

0

Tôi đã giải quyết theo cách này, khi tôi phải sử dụng chỉ số và giá trị foreach trong cùng bối cảnh:

$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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.