2013-05-15 22 views
5

Tôi đang học PHP để có bài kiểm tra nâng cao. Bài kiểm tra thực hành nói rằng lần lặp đầu tiên tốt hơn lần thứ hai. Tôi không hiểu tại sao. Cả hai đều lặp lại nội dung của một mảng tốt.Sự khác nhau giữa hai mảng Iterations là gì?

// Đầu tiên một:

foreach($array as $key => &$val) { /* ... */ } 

// Thứ hai một:

foreach($array as $key => $val) { /* ... */ } 
+0

Vâng, nó có xu hướng gây nhầm lẫn cho mọi người tốt hơn: http://stackoverflow.com/questions/6287970/php-foreach-statement-by-reference-unexpected-behaviour-when-reusing-iterator –

+0

Tôi khuyên bạn nên đọc [điều này ] (http://stackoverflow.com/questions/10057671/how-foreach-actually-works). – BlitZ

+3

Bài kiểm tra nào? Tôi không thể tin rằng đây là từ ZCE –

Trả lời

10

Các thử nghiệm thực tế cho rằng phiên đầu tiên là tốt hơn so với thứ hai.

Đó không phải là lời khuyên tốt nhất. Chúng là các công cụ khác nhau cho các công việc khác nhau.

& có nghĩa là xử lý biến theo tham chiếu thay vì bản sao.

Khi bạn có tham chiếu biến, nó tương tự như con trỏ trong C. Truy cập biến cho phép bạn truy cập vị trí bộ nhớ của biến ban đầu, cho phép bạn sửa đổi giá trị thông qua một số nhận dạng khác.

// Some variable. 
$a = 42; 

// A reference to $a. 
// & operator returns a reference. 
$ref = &$a; 

// Assignment of $ref. 
$ref = "fourty-two"; 

// $a itself has changed, through 
// the reference $ref. 
var_dump($a); // "fourty-two" 

Ví dụ tham chiếu trên CodePad.

Hành vi bình thường của foreach là tạo bản sao có sẵn cho khối được liên kết. Điều này có nghĩa là bạn được tự do gán lại nó, và nó sẽ không ảnh hưởng đến thành viên mảng (điều này sẽ không xảy ra đối với các biến luôn là các tham chiếu, chẳng hạn như các cá thể lớp).

Sao chép ví dụ trên CodePad.

Ví dụ về lớp trên CodePad.

Sử dụng tham chiếu trong foreach có một số tác dụng phụ, chẳng hạn như một tham chiếu lơ lửng $val có thể được sửa đổi sau này do tai nạn và ảnh hưởng đến mảng.

Ví dụ về tham chiếu lơ lửng trên CodePad.

+0

Cảm ơn để được giúp đỡ! Bạn có thể nói thêm một chút về "tham chiếu như trái ngược với một bản sao" không?Hiểu biết duy nhất của tôi về & sẽ viết trên một biến như $ Foo2 = &$Foo1; – Willow

+0

@Willow Chắc chắn, hãy xem chỉnh sửa sắp tới. – alex

+0

Tôi hiểu. Vì vậy, nếu tôi sử dụng và tôi có thể chỉnh sửa mảng bên ngoài vòng lặp foreach bằng cách gọi $ val? Cảm ơn rất nhiều! Bạn đã làm một công việc tuyệt vời để làm rõ điều này. – Willow

1

Ví dụ đầu tiên bao gồm các tài liệu tham khảo &-nhà điều hành cho $val -> bất kỳ thay đổi $val sẽ được lưu vào $array.

Điều này không có nghĩa là "tốt hơn" so với ví dụ # 2.