Hướng dẫn php foreach reference or copy - php foreach tham khảo hoặc sao chép
Tôi đã phải dành một vài giờ để tìm ra lý do tại sao A [3] đang thay đổi trên mỗi lần lặp. Đây là lời giải thích mà tôi đã đến. Show Có hai loại biến trong PHP: các biến bình thường và biến tham chiếu. Nếu chúng ta gán một tham chiếu của một biến cho một biến khác, biến trở thành biến tham chiếu. ví dụ trong
nếu chúng ta làm
Phần tử 0 ( 3) trở thành một biến tham chiếu. 4 điểm về phía biến đó; Do đó, nếu chúng ta thực hiện bất kỳ thay đổi nào đối với 4, nó sẽ được phản ánh trong 3 và ngược lại.Bây giờ nếu chúng ta làm
7 sẽ trở thành một biến tham chiếu và 3 sẽ trở thành một biến bình thường (vì không ai khác chỉ vào 3, nó được chuyển đổi thành một biến bình thường. PHP đủ thông minh để biến nó thành một biến bình thường khi không ai khác hướng về phía nó)Đây là những gì xảy ra trong vòng lặp đầu tiên
Sau lần lặp cuối cùng 0 là một biến tham chiếu.Vì 4 đang chỉ ra 0 bất kỳ thay đổi nào đối với 4 dẫn đến thay đổi thành 0Trong vòng lặp thứ hai,
Trong mỗi lần lặp khi 4 thay đổi, 0 thay đổi. (Bởi vì 4 vẫn chỉ vào 0). Đây là lý do tại sao 0 thay đổi trên mỗi lần lặp.Trong lần lặp trước lần lặp cuối cùng, 4 được gán giá trị 'hai'. Vì 4 điểm đến 0, 0 hiện có được giá trị 'hai'. Giữ nó trong tâm trí.Trong lần lặp cuối cùng, 4 (chỉ vào 0) hiện có giá trị là 'hai', bởi vì 0 đã được đặt thành hai trong lần lặp trước đó. 7 được in. Điều này giải thích tại sao 'hai' được lặp lại khi $ v được in trong lần lặp cuối cùng. Đây là một ví dụ tại sao tham chiếu từng lần trong các vòng lặp foreach là xấu.
Điều này là do khi vòng lặp thứ hai thực thi, 8 vẫn là một tài liệu tham khảo. Do đó, với mỗi lần lặp, tham chiếu ban đầu được ghi đè.Thus, with each iteration the original reference is overwritten. Bạn có thể sửa nó bằng cách gọi
sau vòng lặp qua từng tham chiếu. Vì vậy, nếu bạn đã từng sử dụng kiểu mã hóa này, đừng quên bỏ lại biến tham chiếu sau vòng lặp.don't forget to unset the reference variable after the loop. Tuy nhiên, tôi nghĩ tốt nhất là tránh hoàn toàn cạm bẫy này và chỉ viết 9 vòng lặp phải thao tác với mảng gốc theo cách thông thường: CẬP NHẬT (2017-24-12): Bài viết này mô tả hành vi sao chép của 9 in PHP 5. A better description of the overall foreach behavior and the reasons behind it, covering both PHP 5 and PHP 7, is available in this StackOverflow answer.Bài đăng này đòi hỏi một số kiến thức về hoạt động nội bộ của PHP, cụ thể là 1S, 2 và hành vi sao chép trên các tác phẩm. Nếu những điều khoản đó không có ý nghĩa với bạn, bạn sẽ cần phải đọc chúng trong Oder để hiểu bài đăng này. Tôi muốn giới thiệu một bài viết của Sara Golemon.PHP từ 9 là một cấu trúc ngôn ngữ rất gọn gàng và điểm. Vẫn còn một số người không thích sử dụng nó, vì họ nghĩ rằng nó chậm. Một lý do thường được đặt tên là 9 sao chép mảng nó lặp lại. Do đó, một số người khuyên bạn nên viết:
Thay vì trực quan và đơn giản hơn nhiều:
Có hai vấn đề này:
Khi nào bản sao foreach?Việc 9 có sao chép mảng hay không và bao nhiêu phụ thuộc vào ba điều: liệu mảng lặp có được tham chiếu hay không, 2 của nó cao như thế nào và liệu lần lặp có được thực hiện hay không.Không được tham chiếu, refCount == 1Trong mã dưới đây 8 không được tham chiếu và có số tiền rebount là 9. Trong trường hợp này 9 sẽ không sao chép mảng (bằng chứng) - trái với niềm tin phổ biến rằng 9 luôn sao chép mảng lặp nếu nó được tham chiếu.not copy the array
(proof) - contrary to the popular belief that 9 always copies the iterated array if it isn’t referenced. 0Lý do rất đơn giản: tại sao nó nên? Điều duy nhất mà 9 sửa đổi về 8 là con trỏ mảng nội bộ. Đây là hành vi mong đợi và do đó không cần phải ngăn chặn.Không được tham chiếu, refcount> 1Mã sau đây trông rất giống với mã trước. Sự khác biệt duy nhất là mảng hiện được thông qua như một đối số. Điều này có vẻ như là một sự khác biệt không đáng kể, nhưng nó thay đổi hành vi của 9: Bây giờ nó sẽ sao chép cấu trúc mảng, nhưng không phải là các giá trị (bằng chứng; nếu bạn muốn thấy rằng đây thực sự chỉ là cấu trúc được sao chép so sánh điều này và tập lệnh đó . Chỉ thứ nhất sao chép cấu trúc, bản sao thứ hai).will copy the array structure, but not the values (proof; if you want to see that this is really only the structure being copied compare this
and that script. The first only copies the structure, the second copies both). 1Điều này có vẻ kỳ lạ lúc đầu: tại sao nó sẽ sao chép khi mảng được chuyển qua một đối số, nhưng không phải nếu nó được xác định trong hàm? Lý do là mảng 1 hiện được chia sẻ giữa nhiều biến: biến 8 bên ngoài hàm và biến 8 bên trong nó. Nếu 9 sẽ lặp lại mảng mà không sao chép cấu trúc của nó, nó sẽ không chỉ thay đổi con trỏ mảng của biến 8 trong hàm, mà còn cả con trỏ của biến 8 bên ngoài hàm. Do đó, 9 cần sao chép cấu trúc mảng (tức là bảng băm). Mặt khác, các giá trị vẫn có thể chia sẻ zvals và do đó don don cần được sao chép.Tham chiếuTrường hợp tiếp theo rất giống với trường hợp trước. Sự khác biệt duy nhất là mảng được truyền qua tham chiếu. Trong trường hợp này, mảng một lần nữa sẽ không được sao chép (bằng chứng).not be copied (proof). 2Trong trường hợp này, lý do tương tự được áp dụng như với trường hợp trước: bên ngoài 8 và bên trong 8 chia sẻ 1S. Sự khác biệt là bây giờ chúng là tài liệu tham khảo ( 5). Do đó, trong trường hợp này, người ta dự đoán rằng bất kỳ thay đổi nào đối với mảng bên trong cũng sẽ được thực hiện cho mảng bên ngoài. Vì vậy, nếu con trỏ mảng của mảng bên trong được thay đổi, con trỏ mảng của mảng ngoài cũng sẽ thay đổi. Đó là lý do tại sao 9 không cần phải sao chép.Lặp lại bằng tài liệu tham khảoCác ví dụ trên là tất cả lặp đi lặp lại theo giá trị. Đối với phép lặp bằng cách tham chiếu cùng các quy tắc được áp dụng, nhưng tham chiếu giá trị bổ sung thay đổi hành vi sao chép của các giá trị mảng (hành vi về sao chép cấu trúc vẫn ở lại). Trường hợp không được tham chiếu, refcount == 1 không thay đổi. Bằng cách lặp tham chiếu có nghĩa là chúng tôi muốn thay đổi mảng gốc nếu có bất kỳ thay đổi nào đối với 7, do đó, mảng được sao chép (bằng chứng).Vụ án được tham chiếu, cũng có thể giữ nguyên, như trong trường hợp này, một thay đổi thành 7 sẽ thay đổi tất cả các biến tham chiếu mảng lặp (bằng chứng).Chỉ có các trường hợp không được tham chiếu, giới thiệu> 1 trường hợp thay đổi, vì bây giờ cả cấu trúc mảng và giá trị của nó được sao chép được sao chép. Cấu trúc mảng vì nếu không thì con trỏ mảng của biến 8 bên ngoài hàm sẽ thay đổi và các giá trị vì thay đổi thành 7 cũng sẽ thay đổi các giá trị 8 bên ngoài (bằng chứng).Bản tóm tắtĐể tóm tắt:
Có phải foreach tạo một bản sao?Bản tóm tắt.Tóm lại: Foreach sẽ sao chép cấu trúc mảng nếu và chỉ khi mảng lặp không được tham chiếu và có một bản tóm tắt> 1. Foreach sẽ sao chép thêm các giá trị mảng nếu và chỉ khi điểm trước được áp dụng và lần lặp được thực hiện bằng tham chiếu.foreach will copy the array structure if and only if the iterated array is not referenced and has a refcount > 1. foreach will additionally copy the array values if and only if the previous point applies and the iteration is done by reference.
Foreach có nhanh hơn so với PHP không?Tóm lại: Foreach nhanh hơn ForEach với tài liệu tham khảo.foreach is faster than foreach with reference.
Foreach () trong PHP là gì?Foreach là gì trong PHP?Phương thức foreach () được sử dụng để lặp qua các phần tử trong một mảng được lập chỉ mục hoặc kết hợp.Nó cũng có thể được sử dụng để lặp lại trên các đối tượng.Điều này cho phép bạn chạy các khối mã cho mỗi phần tử.used to loop through the elements in an indexed or associative array. It can also be used to iterate over objects. This allows you to run blocks of code for each element.
Liệu foreach mảng đột biến?foreach () không làm biến đổi mảng mà nó được gọi, nhưng hàm được cung cấp như CallbackFn có thể., but the function provided as callbackFn can. |