2012-12-02 56 views
6

nhìn lúc này:chìa khóa php() trong hành vi foreach vòng lặp kỳ lạ HOẶC lấy chìa khóa tiếp theo trong vòng lặp foreach

<?php 
    $array = array('a' => '…', 'b' => '…', 'c' => '…', 'd' => '…', 'e' => '…', 'f' => '…'); 
    foreach ($array as $key => $val){ 
     echo "current key: $key, next key: ".key(($array))."<br>"; 
    } 
?> 

OUTPUT:

current key: a, next key: b 
current key: b, next key: c 
current key: c, next key: d 
current key: d, next key: e 
current key: e, next key: f 
current key: f, next key: a 

Tôi đang tìm kiếm một chức năng để có được khóa tiếp theo của một mảng kết hợp trong vòng lặp foreach. tôi đã thử một chút và đột nhiên nó hoạt động. (như bạn có thể thấy trong ví dụ của tôi).

NHƯNG TẠI SAO NÀY LÀM VIỆC? Nó có ý nghĩa không? ... không phải với tôi! Bạn có thể giải thích điều này cho tôi không?

Đó là vì phần key(($array)) nhưng tại sao? tôi có nghĩa là .. đó là một sai lầm .. tôi muốn viết key($array) nhưng tôi quên xóa 2 dấu ngoặc gói. Vì vậy, đó là trùng hợp ngẫu nhiên !!!

Tại sao nó hoạt động theo cách này? ý tôi là, nó tốt nhưng ... ????

+3

Thú vị. Nếu bạn bật báo cáo lỗi, bạn sẽ thấy nhiều lỗi. Các dấu ngoặc phụ đang phá vỡ tham chiếu biến trực tiếp. '$ a' là một biến,' ($ a) 'là một biểu thức dẫn đến giá trị * của' $ a'. 'key' mong đợi một biến được chuyển bởi tham chiếu. Bạn không chắc chắn chính xác 'khóa' nào thực hiện với điều đó và tại sao nó hoạt động theo cách nó hoạt động, nhưng tôi sẽ tập tin này theo hành vi sai, không xác định. – deceze

+1

whoa, nếu đây là hành vi dự định tuyệt vời. Đã có rất nhiều lần tôi có thể đã sử dụng một cái gì đó như thế này. –

+0

nhưng bạn gợi ý điều gì? tôi sẽ giữ nó theo cách đó? –

Trả lời

4

Theo Hướng dẫn sử dụng PHP cho khóa key, () trả về phần tử chỉ mục của vị trí mảng hiện tại.

Sự cố không quá nhiều với key hoặc thậm chí với dấu ngoặc kép. Key nhận mảng bằng cách tham chiếu, do đó các cặp ngoặc kép không hoạt động nhiều.

Hành vi đến từ foreach. Khi foreach lặp lại qua mảng, các phiên bản PHP khác nhau sẽ hoạt động khác nhau trên thiết lập con trỏ current nội bộ của mảng, đó là những gì key(), next(), current(), v.v., đang xem xét khi nào chúng được gọi.

Mảng trong PHP không giống như mảng trong hầu hết các ngôn ngữ; chúng thực sự là các đối tượng (đặc biệt là các mảng kết hợp). Hãy nghĩ về chúng giống như danh sách liên kết (chúng là không danh sách liên kết, nhưng chỉ cần đi với tôi cho mục đích minh họa) - khi bạn lặp lại thông qua, bạn cần biết bạn đang ở đâu và bạn sẽ tiếp theo ở đâu.

gì là rõ ràng xảy ra ở đây đó là trên bất kỳ phiên bản của PHP bạn đang chạy, foreach được thiết lập current con trỏ nội bộ để các yếu tố next tại đầu của vòng lặp for, ngay lập tức sau khi cài đặt các biến $key$value trong ma cua ban.

Tôi chắc chắn không phụ thuộc vào hành vi này, vì các cập nhật tiếp theo đối với PHP có thể phá vỡ mã này. Nó chỉ là một sự trùng hợp thú vị của phiên bản cụ thể này. Nếu bạn muốn phím tiếp theo, hãy xem thay thế vòng lặp foreach của bạn. Hướng dẫn sử dụng PHP trên next() có các ví dụ hay và chắc chắn bạn cũng có thể xem prev(), each() và các chức năng khác trong phần "xem thêm".

+0

+100, chắc chắn là một câu trả lời hay. –

Các vấn đề liên quan