PHP thay đổi giá trị mảng trong foreach
Trong ví dụ này, chúng tôi đã tạo một mảng gồm năm phần tử với các giá trị số. Sau đó, vòng lặp foreach PHP được sử dụng để lặp qua mảng đó Show
Bên trong vòng lặp foreach, chúng tôi đã sử dụng câu lệnh echo để hiển thị các giá trị mảng. Xem ví dụ và mã bằng cách nhấp vào hình ảnh hoặc liên kết bên dưới Một ví dụ với khóa và giá trị mảngTrong ví dụ này, chúng ta sẽ sử dụng cách khác là sử dụng vòng lặp foreach i. e. bao gồm cả chìa khóa. Để làm được điều đó, chúng tôi đã tạo một mảng kết hợp gồm ba phần tử. Mảng $salaries được xác định theo sau bởi ba tên nhân viên (đóng vai trò là khóa) và tiền lương là giá trị Ví dụ thay đổi giá trị phần tử mảng trong vòng lặp foreachBạn có thể sửa đổi giá trị của các phần tử của mảng đã cho bằng cách sử dụng vòng lặp foreach. Đối với điều đó, hãy sử dụng “&” trước “$” cho biến giá trị e. g
Giá trị sẽ được sửa đổi theo tham chiếu. Để làm cho nó rõ ràng hơn, hãy xem ví dụ sau Trong ví dụ này, chúng ta đã tạo một mảng số gồm năm phần tử. Sau đó, chúng tôi chỉ cần sử dụng một vòng lặp foreach để hiển thị các giá trị phần tử mảng Sau đó, chúng tôi đã sử dụng một vòng lặp foreach khác trong đó $value_of_element đứng trước “&”. Bên trong dấu ngoặc nhọn, chúng tôi đã gán các giá trị mới cho các phần tử mảng Để xem sự khác biệt giữa mảng trước và sau khi gán các giá trị mới, mảng được hiển thị bằng cách sử dụng hàm print_r, được sử dụng để hiển thị biểu diễn trực quan của mảng đã cho Xem bản demo và mã bằng cách nhấp vào liên kết hoặc hình ảnh bên dưới Xem bản demo và mã trực tuyến Tại sao chúng tôi sử dụng PHP foreach?Vòng lặp foreach trong PHP được sử dụng để thao tác với mảng foreach sẽ lặp qua từng phần tử của mảng đã cho Bạn cũng có thể sử dụng vòng lặp for đơn giản để thao tác với mảng e. g. bằng cách sử dụng thuộc tính độ dài để lấy độ dài của mảng và sau đó sử dụng nó làm toán tử tối đa. Tuy nhiên, foreach làm cho nó khá đơn giản hơn, được cung cấp riêng để sử dụng với mảng Nếu bạn làm việc với MySQL hoặc một số cơ sở dữ liệu khác, thì mục đích của nó sẽ rõ ràng hơn. Ví dụ: tìm nạp nhiều hàng từ một bảng của cơ sở dữ liệu MySQL và gán nó vào một mảng. Sau đó, lặp qua các phần tử mảng cùng với việc thực hiện một số hành động bằng cách sử dụng vòng lặp foreach Ngoài ra, xin lưu ý rằng bạn chỉ có thể sử dụng vòng lặp foreach với mảng hoặc đối tượng Cách sử dụng vòng lặp foreachNhư đã mô tả trong phần đầu tiên, có hai cách để sử dụng vòng lặp foreach trong PHP. Cả hai được mô tả dưới đây
1 2 3 4 5 foreach($array_name as $value){
echo $giá trị
} Theo cách sử dụng vòng lặp foreach này, bạn phải chỉ định tên mảng theo sau là biến $value Đối với mỗi lần lặp, giá trị của phần tử mảng hiện tại được gán cho biến $value. Sau khi hoàn thành việc lặp, nó sẽ được chuyển sang phần tử tiếp theo cho đến khi tất cả các phần tử của mảng được giải trí
1 2 3 4 5 foreach ($array_name as $key_of_element => $value_of_element){
// mã sẽ được thực thi ở đây
} Rõ ràng từ cú pháp, điều này khá hữu ích cho các mảng kết hợp, nơi chúng tôi sử dụng các cặp khóa/giá trị Vì vậy, với mỗi lần lặp, giá trị của phần tử hiện tại sẽ được gán cho biến $value_of_element, giống như trong phương thức đầu tiên. Ngoài ra, khóa của phần tử được gán cho biến $key_of_element, đây là biến bổ sung trong phương pháp này Vì vậy, nếu bạn đang làm việc với mảng số, bạn có thể sử dụng phương pháp đầu tiên, nơi bạn không cần khóa của các phần tử Hầu như mọi ngôn ngữ lập trình đều hỗ trợ vòng lặp foreach và PHP cũng không ngoại lệ. Tôi cá là bạn cũng đã sử dụng nó rất nhiều lần Không có gì đặc biệt về các vòng lặp foreach trong PHP, nhưng tôi nghĩ có một số sự thật mà bạn nên biết. Các cấu trúc điều khiển vòng lặp được sử dụng mọi lúc, vì vậy điều quan trọng là không mắc lỗi khi sử dụng chúng
Trong bài đăng hôm nay, tôi sẽ chỉ cho bạn 6 sự thật mà mọi nhà phát triển PHP nên biết về vòng lặp foreach.
bản quyền. Hình ảnh của StockUnlimited
1. ĐÚC CHÌA KHÓA
PHP có một số tính năng thân thiện với người dùng sẽ giúp người mới bắt đầu và các nhà phát triển ít kinh nghiệm viết mã dễ dàng hơn. Một trong số đó là kiểu tung hứng. trình thông dịch PHP tự động đặt các loại biến tùy thuộc vào ngữ cảnh và toán tử nào được sử dụng Điều này không có nghĩa là PHP không có các kiểu. Trên thực tế, mỗi biến đều có loại riêng, nhưng nó có thể thay đổi theo thời gian
$a = 1 biến $a thành số nguyên và $a = ‘1’ makes $a a string. In both cases, even if the type is different, a statement like $a = $a + 1 sẽ khiến $ . becomes an integer. Mặc dù việc tung hứng kiểu có thể thuận tiện, nhưng điều quan trọng là phải luôn xem xét loại biến mà chúng ta đang xử lý, đặc biệt khi sử dụng các toán tử so sánh nghiêm ngặt (như “ ===“). Strict comparison operators are very useful because they can differentiate between values like 0, FALSE or NULL, while loose comparison operators (llike “== “) xem xét chúng .
Hãy đi thẳng vào vấn đề. Bên trong các vòng lặp foreach, bạn có thể truy cập mọi cặp khóa/giá trị của mảng mà bạn đang lặp lại và đôi khi bạn có thể cần so sánh khóa với một số giá trị khác. Vấn đề là như thế này. nếu và chỉ khi, khóa là một chữ số, thì nó sẽ tự động được chuyển đổi thành một số nguyên khi bắt đầu vòng lặp . Do đó, so sánh nghiêm ngặt nó với một chuỗi sẽ luôn trả về FALSE
Ví dụ sau đây cho thấy rõ vấn đề.
đầu ra là Khóa là. đầu tiên
Như bạn có thể thấy ở đầu ra, trong khi khóa mảng thứ hai thực sự là một chuỗi (‘2’), nó được tự động chuyển thành một số nguyên bên trong vòng lặp vì nó là một ký tự số. Nếu chúng ta cố gắng so sánh nghiêm ngặt nó với '2', biểu thức sẽ trả về false .
Một giải pháp cho vấn đề này là truyền rõ ràng khóa thành chuỗi ở đầu mỗi vòng lặp (trên dòng 13)
Lần này đầu ra là Khóa là. đầu tiên
Bây giờ, phép so sánh nghiêm ngặt giữa khóa thứ hai và '2' trả về true , như chúng ta mong đợi.
2. SỬA ĐỔI Mảng TỪ BÊN TRONG VÒNG ĐẶT
Nếu bạn đang sử dụng foreach để lặp qua một mảng và bạn muốn sửa đổi chính mảng đó, có hai cách để thực hiện việc đó Việc đầu tiên là trỏ đến phần tử mảng mà bạn muốn chỉnh sửa bằng cú pháp $array[$key] (vì vậy bạn có . Một cách khác là xác định $value làm tham chiếu và chỉnh sửa trực tiếp tham chiếu đó
Hai ví dụ sau đây cho thấy làm thế nào để làm điều đó
Trong cả hai trường hợp, đầu ra sẽ là.
3. THAY ĐỔI BIẾN
Điều quan trọng cần lưu ý là các vòng lặp foreach không có phạm vi riêng . Điều này có nghĩa là các biến được xác định bên ngoài vòng lặp cũng có sẵn bên trong nó và bất kỳ biến nào được khai báo bên trong vòng lặp sẽ tiếp tục có thể truy cập được ngay cả sau khi vòng lặp kết thúc. Điều này cũng áp dụng cho các biến $key => $value được sử dụng trong foreach head.
Ví dụ này cho thấy điều gì có thể xảy ra.
Sau vòng lặp, $value sẽ không chứa 'giá trị của tôi' anymore but the value 2 instead, as it has been overwritten by the foreach assignment.
Trong khi tìm kiếm thêm thông tin chi tiết về vấn đề này, tôi đã tìm thấy bài đăng thú vị này nêu bật một mối nguy hiểm tiềm tàng khác
Hãy xem một ví dụ trước.
Đầu ra từ hai print_r() là.
Sau vòng lặp foreach thứ hai, phần tử cuối cùng bên trong mảng đã thay đổi. Chuyện gì đã xảy ra thế? Trong lần tìm kiếm đầu tiên, chúng tôi sử dụng cú pháp &$value , vì vậy $value is set as a reference to each array’s element. In the last loop, $value tương đương với $array[2]. Sau khi foreach kết thúc, $value vẫn có thể truy cập được (vì foreach không có phạm vi riêng). Khi foreach thứ hai bắt đầu, $value vẫn bị ràng buộc với phần tử cuối cùng của mảng, vì vậy trong mọi vòng lặp, cả $value và $array[2] đều bị ghi đè
Đây là những gì xảy ra chi tiết hơn
Điều đó giải thích kết quả Để tránh vấn đề này, luôn luôn nên bỏ đặt một biến được sử dụng trong vòng lặp foreach, đặc biệt là khi sử dụng tham chiếu
4. CÓ CẦN THIẾT LẬP LẠI() KHÔNG?
Trước PHP 7, foreach dựa vào con trỏ mảng bên trong để lặp, vì vậy nên sử dụng reset() sau đó ( . Đây không còn là trường hợp nữa với PHP 7, vì foreach hiện sử dụng con trỏ bên trong của chính nó. Điều này giúp chúng tôi tiết kiệm một vài dòng mã
Ví dụ sau cho thấy sau vòng lặp foreach con trỏ trong của mảng vẫn trỏ đến phần tử đầu tiên
5. FOREACH VS FOR VS WHILE HIỆU SUẤT
bản quyền. Hình ảnh của StockUnlimited
Khi cần lặp qua một mảng, bạn cũng có thể sử dụng vòng lặp while hoặc vòng lặp for thay vì sử dụng foreach Cách nào là tốt nhất về hiệu suất?
Tôi đã chạy thử nghiệm với một mảng gồm 1 triệu mục. Khi sử dụng các phím số nguyên, hóa ra cả ba cấu trúc điều khiển chạy cùng một lúc (0. 02 giây trên máy thử nghiệm của tôi) Tuy nhiên, nếu chúng ta đang xử lý mảng kết hợp (i. e. , mảng có khóa chuỗi), vòng lặp foreach nhanh hơn hai lần so với hai cấu trúc điều khiển khác. Điều này có thể là do các cấu trúc while và for cần sử dụng hàm phụ trợ để truy xuất các phần tử của mảng, như current() và next(). Foreach thường là cách dễ nhất để lặp qua các mảng và hóa ra nó cũng là cách nhanh nhất, vì vậy đây sẽ là lựa chọn ưu tiên của bạn Tuy nhiên, điều đáng nói là trong các tình huống thực tế, sự khác biệt về hiệu năng sẽ hầu như không đáng kể, trừ khi bạn cần xử lý các mảng thực sự lớn (và trong trường hợp đó, có lẽ bạn nên sửa ứng dụng của mình trước…) Nếu bạn muốn xem mã kiểm tra, chỉ cần nhấp vào đây để hiển thị nó
Kiểm tra cấu trúc điều khiển
6. KEY => GIÁ TRỊ HIỆU SUẤT
Vòng lặp PHP Foreach hỗ trợ cả $array dưới dạng $value và $array dưới dạng $key . syntax. Cái đầu tiên cũng là cái nhanh nhất về hiệu suất. trong thử nghiệm của tôi, sử dụng cú pháp thứ hai dẫn đến thời gian thực hiện lâu hơn 50%. Nếu bạn không cần các khóa, có lẽ bạn nên sử dụng cú pháp đầu tiên Mặc dù vậy, các con số quá nhỏ nên thật không may là bạn sẽ nhận thấy bất kỳ sự khác biệt nào trong các tình huống thực tế, vì vậy đừng quá lo lắng về điều đó (trên máy thử nghiệm của tôi, hai thử nghiệm chạy trong khoảng 0. 2 và 0. 3 giây, đối với mảng 10 triệu phần tử) Bạn có thể sửa đổi mảng trong foreach không?Có thể forEach() Sửa đổi Mảng gốc không? . forEach() will not directly change the object that calls it, but that object may be changed by the callback function.
Làm cách nào để thay đổi giá trị của một mảng trong PHP?Hàm array_replace() thay thế các giá trị của mảng đầu tiên bằng các giá trị của các mảng tiếp theo . Mẹo. Bạn có thể gán một mảng cho hàm hoặc bao nhiêu mảng tùy thích. Nếu một khóa từ mảng1 tồn tại trong mảng2, các giá trị từ mảng1 sẽ được thay thế bằng các giá trị từ mảng2.
Làm cách nào để lưu trữ giá trị trong mảng bằng cách sử dụng foreach trong PHP?Khai báo mảng $items bên ngoài vòng lặp và sử dụng $items[] để thêm các mục vào mảng . $items = mảng(); .
Làm cách nào để thay đổi chỉ mục của một mảng trong PHP?Việc lập chỉ mục lại của một mảng có thể được thực hiện bằng cách sử dụng một số hàm sẵn có cùng nhau . Các chức năng này là. hàm array_combine(). Hàm array_combine() là một hàm sẵn có trong PHP, được sử dụng để kết hợp hai mảng và tạo một mảng mới bằng cách sử dụng một mảng cho các khóa và một mảng khác cho các giá trị. |