1. Hàm array_walk() trong PHP

Hàm array_walk() trong PHP giúp ta truyền một hàm callback hay hàm do người dùng tạo để truyền vào mảng. Hàm array_walk() sẽ đi qua tất cả các phần tử trong mảng, bất kể là vị trí đặt con trỏ bên trong mảng nó sẽ đều đi qua. Hàm array_walk() sẽ áp dụng hàm callback do người dùng tạo với từng phần tử trong mảng. Các keyvalue của các phần tử mảng là các tham số trong hàm do người dùng truyền vào. Hàm sẽ trả về giá trị boolean với True khi đã áp dụng thành công hàm callback vào mảng. Ngược lại hàm sẽ trả về False nếu việc áp dụng hàm callback không thành công vào mảng. Hàm array_walk() được giới thiệu và sử dụng từ phiên bản PHP 4.0

2. Cú pháp của hàm array_walk() trong PHP

Ta có cú pháp của hàm array_walk() trong PHP là :

array_walk($array, myfunction, $extraParam)

Trong đó :

  • $array : mảng đầu vào mà ta truyền vào hàm. Tham số này là bắt buộc trong hàm
  • myfunction : hàm callback hay hàm do người dùng định nghĩa . Nếu là hàm do người dùng định nghĩa thì sẽ loại bỏ hai tham số trong đó thay vào bằng value là tham số đầu tiên và key sẽ thay vào làm tham số thứ hai. Nó cũng là tham số bắt buộc trong hàm array_walk()
  • $extraParam : bổ sung thêm tham số vào hàm do người dùng truyền vào ngoài hai tham số keyvalue trong mảng. Tham số này là tùy chọng trong hàm

Chỉ các giá trị của $array có thể bị thay đổi và ta không thể thay đổi cấu trúc của nó. Tức là người lập trình không thể thêm, bỏ thiết lập hoặc sắp xếp lại các phần tử. Nếu lệnh gọi lại không tôn trọng yêu cầu này, thì hoạt động của hàm này là không xác định và không thể đoán trước được. Giá trị trả về sẽ là giá trị boolean với True khi đã áp dụng thành công hàm myfunction vào mảng. Ngược lại hàm sẽ trả về False nếu việc áp dụng hàm myfunction không thành công vào mảng.

Lưu ý 

Nếu myfunction cần hoạt động với các giá trị thực của mảng, hãy chỉ định tham số đầu tiên của myfunction làm tham chiếu. Sau đó, bất kỳ thay đổi nào được thực hiện đối với các phần tử đó sẽ được thực hiện trong chính mảng ban đầu.

Những hàm có sẵn ( strtolower() , strcmp() ,… ) sẽ đưa ra cảnh báo nếu nhiều hơn số đối số dự kiến được truyền vào và không thể sử dụng trực tiếp như một lệnh gọi lại.

Ví dụ : chạy từng phần tử mảng trong một hàm do người dùng xác định

<?php
function myfunction($value,$key)
{
echo "Key $key có value là $value<br>";
}
$a=array("a"=>"PHP","b"=>"Java","c"=>"Python");
array_walk($a,"myfunction");
?>

Kết quả

Key a có value là PHP
Key b có value là Java
Key c có value là Python

Ta tạo một hàm là myfunction rồi truyền vào hàm array_walk() . Hàm này sẽ lặp và thay thế tất cả keyvalue của mảng $a vào hàm myfunction . Kết quả được in ra màn hình như trên.

3. Ví dụ về hàm array_walk() trong PHP

Ví dụ 1: truyền vào tham số thứ ba

<?php
function myfunction($value,$key,$p)
{
echo "$key $p $value<br>";
}
$a=array("a"=>"PHP","b"=>"Java","c"=>"Python");
array_walk($a,"myfunction","có value là: ");
?>

Kết quả

a có value là: PHP
b có value là: Java
c có value là: Python

Với việc truyền vào thêm tham số thứ ba thì hàm array_walk() sẽ ép chúng vào như bình thường thôi. Nhưng ta cần lưu ý một ArgumentCountError sẽ được ném ra nếu hàm callback yêu cầu nhiều hơn 2 tham số ( valuekey của mảng ) hoặc nhiều hơn 3 tham số nếu $extraParam cũng được truyền.

Ví dụ 2: thay đổi giá trị phần tử trong mảng

<?php
function myfunction(&$value,$key)
{
$value="HTML";
}
$a=array("a"=>"PHP","b"=>"Java","c"=>"Python");
array_walk($a,"myfunction");
echo '<pre>';
print_r($a);
?>

Kết quả

Array
(
    [a] => HTML
    [b] => HTML
    [c] => HTML
)

Với việc chỉ truyền vào hàm myfunction() trong ví dụ này sẽ thay thế toàn bộ value của mảng $a thành value chỉ định trong hàm truyền vào. Nhưng với key thì không thể làm được nhé.

Ví dụ 3: ta cũng có thể truyền vào hàm array_walk() một hàm ẩn danh

<?php
$elements = ['a', 'b', 'c'];

array_walk($elements, function ($value, $key) {
  echo "{$key} => {$value}<br>";
});

?>

Kết quả

0 => a
1 => b
2 => c

Ví dụ 4: sử dụng hàm array_walk() với mảng đa chiều

<?php
function myfunction($value,$key)
{
echo "key $key có value là: $value<br>";
}
$a1=array("a"=>"PHP","b"=>"Java");
$a2=array($a1,"1"=>"CSS","2"=>"Python");
array_walk($a2,"myfunction");
?>

Kết quả

key 0 có value là: Array
key 1 có value là: CSS
key 2 có value là: Python

Ta có thể thấy kết quả có gì đó khác lạ không? Đây chính là điểm yếu của hàm array_walk() khi thao tác với hàm đa chiều. Vậy làm sao để khắc phục được. Hàm array_walk_recursive() trong PHP mà ta sẽ tìm hiểu ở bài sau sẽ giải quyết vấn đề này.