1. Hàm array_walk_recursive() trong PHP

Hàm array_walk_recursive() trong PHP cũng sẽ 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_recursive() 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_recursive() 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.

Đến đây ta có thể thấy nó giống với hàm array_walk() mà ta đã tìm hiểu ở bài trước. Tuy nhiên hàm array_walk_recursive() sẽ dùng những hàm được truyền vào đi qua key và value một cách đệ quy. Hàm array_walk() thì không. Điều này giúp cho hàm array_walk_recursive() sẽ thao tác với những mảng nhiều chiều hiệu quả hơn rất nhiều.

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

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

array_walk_recursive($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_recursive()
  • $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

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. Và nếu như $extraParam được cung cấp thì nó sẽ được bổ sung làm tham số thứ ba cho hàm myfunction . Giá trị trả về sẽ là giá trị boolean với True khi đã áp dụng thành công hàm myfuncion 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.

Ví dụ : chạy từng phần tử của 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_recursive($a,"myfunction");
?>

Kết quả

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

Với ví dụ này là một ví dụ đơn giản. Ta có thể thấy nó gần như giống với hàm array_walk() . Tuy nhiên hãy xem tiếp những ví dụ bên dưới để thấy được sự khác biệt.

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

Ví dụ 1: chạy từng phần tử của 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>";
}
$a1=array("a"=>"PHP","b"=>"Java");
$a2=array($a1,"1"=>"CSS","2"=>"Python");
array_walk_recursive($a2,"myfunction");
?>

Kết quả

key a có value là: PHP
key b có value là: Java
key 1 có value là: CSS
key 2 có value là: Python

Ta có thể thấy ngay được rằng trong mảng $a2 lại chứa phần tử là mảng $a1 . Nếu đã xem ở bài trước các bạn có thể thấy rằng khi thay hàm array_walk_recursive() thành hàm array_walk() thì phần kết quả sẽ trông như thế này

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

Bằng một ví dụ như vậy ta có thể thấy được rõ ràng sự khác biệt giữa hai hàm array_walk_recursive()array_walk() . Bởi vì áp dụng đệ quy vào mảng nên hàm array_walk_recursive() sẽ xử lý được mảng sâu hơn và khác phục được điểm yếu này của mảng array_walk()

Ví dụ 2: truyền thêm tham số thứ ba vào hàm

<?php

function myFunction($value, $key , $extraParam)
{
    echo "key $key $extraParam $value <br>";
}


$a1=array("a"=>"PHP", "b"=>"Java");
$a2=array($a1, "1"=>"HTML", "2"=>"Python");

array_walk_recursive($a2, "myFunction", "có value là: ");

?>

Kết quả

key a có value là: PHP
key b có value là: Java
key 1 có value là: HTML
key 2 có value là: Python

Ví dụ 3:

<?php
$a1 = array('a' => 'PHP', 'b' => 'Java');
$a2 = array('c' => $a1, '1' => 'Python');

function test_print($item, $key)
{
    echo "key $key có value là: $item <br>";
}

array_walk_recursive($a2, 'test_print');
?>

Kết quả

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

Ta có thể thấy key“c” lại không hiển thị ra màn hình. Tại sao vậy? Bởi vì bất kỳ key nào chứa một mảng cũng sẽ không bao giờ được truyền cho hàm và nó cũng sẽ không được hiển thị.