Bạn đang xem : foreach trong mảng php

CẢNH BÁO: Vòng lặp qua "giá trị theo tham chiếu" để có "hiệu suất cao hơn" là một lầm tưởng cũ. Nó thực sự là WORSE!

& lt;? Php

chức năng

< p class = "default"> một

(

$ arr

) {< br /> foreach (

$ arr

as

$ val

) {

echo

$ val

; Hàm
}
}

hai

(

< p class = "default"> $ arr

) {
foreach (

$ arr

as & amp;

$ val

) {

echo < / p>

$ val

;
}
}

$ a

= array (

'a'

,

'b'

,

'c'

);

một

(

$ a

);

hai

(

$ a

);

? & gt;

Bạn nghĩ cái nào nhanh hơn?

Rất nhiều người nghĩ rằng câu trả lời là hai () vì nó sử dụng "tham chiếu đến giá trị, mà nó không phải sao chép từng giá trị khi nó lặp lại".

Chà, đó là hoàn toàn sai!

Đây là những gì thực sự xảy ra:

* one ():

- Hàm này nhận một mảng làm đối số ($ arr).
- Bản thân đối số của hàm mảng không được truyền bằng tham chiếu, vì vậy, hàm biết rằng nó không được phép sửa đổi bản gốc.
- Sau đó, vòng lặp foreach sẽ xảy ra. Bản thân mảng không được chuyển qua tham chiếu đến hàm, vì vậy PHP biết rằng nó không được phép sửa đổi mảng bên ngoài, do đó, nó tạo một bản sao của trạng thái bù lặp bên trong của mảng (đó chỉ là một số đơn giản cho biết mục bạn hiện đang ở trong những thứ như foreach ()), hầu như không tốn hiệu suất hoặc bộ nhớ vì nó chỉ là một số nhỏ.
- Tiếp theo, nó sử dụng phần bù lặp đã sao chép đó để lặp qua tất cả các cặp khóa / giá trị của mảng (tức là khóa thứ 0, khóa thứ nhất, khóa thứ 2, v.v.). Và giá trị tại phần bù hiện tại (PHP "zval") được gán cho một biến có tên là $ val.
- $ val có tạo ra một BẢN SAO của giá trị không? Đó là những gì NHIỀU người nghĩ. Nhưng câu trả lời là KHÔNG. KHÔNG. Nó sử dụng lại giá trị hiện có trong bộ nhớ. Với chi phí hiệu suất bằng không. Nó được gọi là "copy-on-write" và có nghĩa là PHP không tạo bất kỳ bản sao nào trừ khi bạn cố gắng SỬA ĐỔI giá trị.
- Nếu bạn cố sửa đổi $ val, SAU ĐÓ nó sẽ cấp phát một zval MỚI trong bộ nhớ và thay vào đó hãy lưu trữ $ val ở đó (nhưng nó vẫn sẽ không sửa đổi mảng ban đầu, vì vậy bạn có thể yên tâm).

Được rồi, vậy phiên bản thứ hai đang làm gì? "Các giá trị lặp lại theo tham chiếu" được yêu thích?

* two ():

- Hàm này nhận một mảng làm đối số ($ arr).
- Mảng Bản thân đối số hàm không được truyền bằng tham chiếu, vì vậy, hàm biết rằng nó không được phép sửa đổi bản gốc.
- Sau đó, vòng lặp foreach sẽ xảy ra. Bản thân mảng không được chuyển qua tham chiếu đến hàm, vì vậy PHP biết rằng nó không được phép sửa đổi mảng bên ngoài.
- Nhưng nó cũng thấy rằng bạn muốn xem xét tất cả các GIÁ TRỊ bằng tham chiếu (& amp; $ val), vì vậy PHP nói "Ồ, điều này thật nguy hiểm. Nếu chúng tôi chỉ cung cấp cho họ tham chiếu đến các giá trị của mảng ban đầu và họ chỉ định một số giá trị mới cho tham chiếu của họ, họ sẽ phá hủy mảng ban đầu mà họ không được phép touch! ".
- Vì vậy, PHP tạo BẢN SAO ĐẦY ĐỦ của toàn bộ mảng và TẤT CẢ CÁC GIÁ TRỊ trước khi nó bắt đầu lặp lại. CÓ!

Do đó: DỪNG sử dụng phương pháp lặp lại "& amp; $ val" cũ, thần thoại! Nó gần như luôn luôn BAD! Với hiệu suất kém hơn và rủi ro về lỗi và lỗi như được trình bày trong sách hướng dẫn.

Bạn luôn có thể viết thủ công các nhiệm vụ mảng một cách rõ ràng mà không cần tham chiếu, như thế này:

& lt;? php

$ a

= array (

1

,

2

,

3

);
foreach (

$ a

as

$ key

= & gt;

$ val

) {

$ a

[

$ key < / p>

] =

$ val

*

10

;
}

? & gt;

Bài học chính là: ĐỪNG lặp lại một cách mù quáng qua các giá trị bằng cách tham chiếu! Nói với PHP rằng bạn muốn tham chiếu trực tiếp sẽ buộc PHP cần sao chép toàn bộ mảng để bảo vệ các giá trị ban đầu của nó! Vì vậy, thay vào đó, chỉ cần lặp lại bình thường và tin tưởng thực tế là PHP * * thực sự đủ thông minh để không bao giờ sao chép các giá trị mảng ban đầu của bạn! PHP sử dụng "copy-on-write", có nghĩa là cố gắng gán một thứ gì đó mới cho $ val là điều DUY NHẤT gây ra sao chép và chỉ của phần tử DUY NHẤT đó! :-) Nhưng dù sao thì bạn cũng không bao giờ làm điều đó, khi lặp lại mà không có tham chiếu. Nếu bạn muốn sửa đổi điều gì đó, bạn sử dụng "$ a [$ key] = 123;" phương pháp cập nhật giá trị.

Hãy tận hưởng và chúc may mắn với mã của bạn! :-)


Xem thêm những thông tin liên quan đến chủ đề foreach trong mảng php

PHP – Access Named Keys in Array – foreach()

  • Tác giả: Eli the Computer Guy
  • Ngày đăng: 2018-12-23
  • Đánh giá: 4 ⭐ ( 6716 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: The foreach() function can turn Named Keys into variables just like it does array values.

Vòng Lặp For, Foreach trong PHP

  • Tác giả: www.codehub.com.vn
  • Đánh giá: 5 ⭐ ( 4464 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Vòng lặp for trong PHP được sử dụng khi chúng ta muốn chạy lặp lại một đoạn code một số lần cho trước. Vòng lặp foreach được sử dụng để lặp qua một mảng.

Bài 7: Vòng lặp Foreach trong PHP (Các loại vòng lặp phần 2)

  • Tác giả: tanhongit.com
  • Đánh giá: 5 ⭐ ( 4416 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Ở bài này mình sẽ vẫn giới thiệu về vòng lặp nhưng nội dung chỉ xoay quanh duy nhất một vòng lặp đó là vòng lặp foreach trong PHP. Các vòng lặp khác hãy…

Kiến thức về Vòng lặp Foreach trong PHP từ A-Z

  • Tác giả: devcamp.edu.vn
  • Đánh giá: 3 ⭐ ( 6772 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hàm Foreach PHP là gì? Vòng lặp Foreach trong PHP là một chuỗi hành động được lặp lại nhiều lần trên khối mã và theo một nguyên tắc nhất định

Bài 6. Mảng và vòng lặp foreach trong PHP

  • Tác giả: dothanhspyb.com
  • Đánh giá: 3 ⭐ ( 2768 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Với cơ sở dữ liệu, khi duyệt và xử lý thì ít khi chúng ta sử dụng đến các vòng lặp for hay while… mà cần phải sử dụng đến mảng và vòng lặp foreach. Với

Vòng Lặp foreach trong PHP — PHP

  • Tác giả: www.stdio.vn
  • Đánh giá: 5 ⭐ ( 8985 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tìm hiểu về cấu trúc vòng lặp foreach trong PHP.

Vòng lặp foreach trong PHP » Cafedev.vn

  • Tác giả: cafedev.vn
  • Đánh giá: 3 ⭐ ( 8041 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Vòng lặp foreach được sử dụng để duyệt qua các phần tử của mảng. Nó chỉ hoạt động trên mảng và đối tượng.

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Cách tạo nút cuộn trở lại đầu trang - Bài viết trên cùng của trang

By ads_php