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 đó

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

PHP thay đổi giá trị mảng trong foreach

Xem bản demo và mã trực tuyến

Một ví dụ với khóa và giá trị mảng

Trong 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ị

PHP thay đổi giá trị mảng trong foreach

Xem bản demo và mã trực tuyến

Ví dụ thay đổi giá trị phần tử mảng trong vòng lặp foreach

Bạ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

&$value_of_element

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

PHP thay đổi giá trị mảng trong foreach

 

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 foreach

Như đã 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

  • Cú pháp để sử dụng phương pháp đầu tiên là

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í

  • Cú pháp sử dụng cách thứ hai

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.

 

 

 

 

 

PHP thay đổi giá trị mảng trong 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 đề.  

 


/* We define a two-elements array. Note that the second key is a numeric literal string. */
$array = array(
   'first' => 'first element',
   '2' => 'second element'
);
/* Here is what happens */
foreach ($array as $key => $value)
{
   echo 'Key is: ' . $key . '
'; echo 'Key type is: ' . gettype($key) . '
'; /* Let's try a comparison */ if ($key === '2') { echo 'Key is "2"!
'; } else { echo 'Key is NOT "2"!
'; } }

đầu ra là

Khóa là. đầu tiên
Loại khóa là. chuỗi
Khóa KHÔNG phải là “2”.
Khóa là. 2
Loại khóa là. số nguyên
Khóa KHÔNG phải là “2”.

 

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)


/* We define a two-elements array. Note that the second key is a numeric literal string. */
$array = array(
   'first' => 'first element',
   '2' => 'second element'
);
/* Here is what happens */
foreach ($array as $key => $value)
{
   $key = strval($key);
   echo 'Key is: ' . $key . '
'; echo 'Key type is: ' . gettype($key) . '
'; /* Let's try a comparison */ if ($key === '2') { echo 'Key is "2"!
'; } else { echo 'Key is NOT "2"!
'; } }

Lần này đầu ra là

Khóa là. đầu tiên
Loại khóa là. chuỗi
Khóa KHÔNG phải là “2”.
Khóa là. 2
Loại khóa là. chuỗi
Khóa là “2”.

 

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 đó


$array = array(1, 2);
foreach ($array as $key => $value)
{
   $array[$key] += 1;
}
print_r($array);


 &$value)
{
   $value += 1;
}
print_r($array);

Trong cả hai trường hợp, đầu ra sẽ là.

Mảng
(
[0] => 2
[1] => 3
)

 

 

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.  

 


$array = array(1, 2);
$value = 'my value';
foreach ($array as $key => $value)
{
   // do something
}
echo $value; /* Output is "2" */

 

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.    


$array = array(1, 2, 3);
foreach ($array as $key => &$value)
{
   // do something
}
/* Everything ok here */
print_r($array);
foreach ($array as $key => $value)
{
   // do something
}
/* Something wrong! */
print_r($array);

Đầu ra từ hai print_r() là.

Mảng
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 2
)

 

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

  • Sau lần tìm kiếm đầu tiên, $value trỏ tới $array[2]
  • Foreach thứ hai, lần lặp đầu tiên. $array[2] được thiết lập với phần tử mảng đầu tiên (do đó, $array[2] = 1)
  • foreach thứ hai, lần lặp thứ hai. $array[2] được thiết lập với phần tử mảng thứ hai (do đó, $array[2] = 2)
  • Lần foreach thứ hai, lần lặp thứ ba. $array[2] được thiết lập với phần tử mảng thứ ba (i. e. chính nó, vì vậy $array[2] = 2)

Đ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

 


$array = array(1, 2, 3);
foreach ($array as $item)
{
   echo 'Item: ' . $item . '
'; } /* Current item is still 1 */ echo 'Current item: ' . current($array); /* Outputs 1 */

 

 

 

5. FOREACH VS FOR VS WHILE HIỆU SUẤT

 

PHP thay đổi giá trị mảng trong foreach

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()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


/* Set this to avoid memory errors */
ini_set('memory_limit','1024M');

$array = array();
/* Use this for creating a numeric array */
for ($i = 0; $i < 1000000; $i++)
{
   $array[$i] = $i;
}
/* Or use this for creating an associative array */
for ($i = 0; $i < 1000000; $i++)
{
   $array[$i] = strval($i) . 'string';
}
$count = count($array);
$start = microtime(TRUE);
/* Foreach loop, ok for both array types */
foreach ($array as $item)
{
   $var = $item;
}
/* For loop only for numeric arrays */
for ($i = 0; $i < $count; $i++)
{
   $var = $array[$i];
}
/* While loop only for numeric arrays */
$i = 0;
while ($i < $count)
{
   $var = $array[$i];
   $i++;
}
/* For loop for associative arrays */
for ($item = current($array); $item !== FALSE; $item = next($array))
{
   $var = $item;
}
/* While loop for associative arrays */
$item = current($array);
while ($item !== FALSE)
{
   $var = $item;
   $item = next($array);
}
$end = microtime(TRUE);
echo ($end - $start);

 

 

 

6. KEY => GIÁ TRỊ HIỆU SUẤT

 

 

Vòng lặp PHP Foreach hỗ trợ cả $array dưới dạng $value$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ị.