1. Hàm array_replace_recursive() trong PHP

Hàm array_replace_recursive() trong PHP cũng được dùng để sửa đổi một mảng. Không giống như hàm array_replace() hàm array_replace_recursive() sẽ sửa đổi mảng theo cách đệ quy.

Việc sửa đổi ở đây bằng cách thay thế giá trị của mảng trước bằng giá trị của mảng sau dựa vào những key . Nếu chúng có cùng key thì hàm array_replace_recursive() sẽ thay thế các phần tử của mảng đầu tiên bằng các phần tử của mảng thứ hai. Việc thay thế sẽ được thực hiện theo những quy tắc sau:

  • Nếu một key trong mảng đầu tiên cũng tồn tại trong mảng thứ hai, thì giá trị của nó trong mảng đầu tiên được thay thế bằng giá trị của key đó trong mảng thứ hai.
  • Nếu một key trong mảng thứ hai không tồn tại trong mảng đầu tiên, thì nó được tạo trong mảng đầu tiên và giá trị của nó từ mảng thứ hai được sao chép trong mảng đầu tiên.
  • Nếu một key trong mảng đầu tiên không có trong bất kỳ mảng nào tiếp theo, thì giá trị của key đó được giữ nguyên trong mảng đầu tiên.
  • Các mảng được xử lý theo thứ tự mà chúng được truyền cho hàm, Nếu có nhiều hơn 2 mảng truyền vào, các mảng truyền vào sẽ được ưu tiên thay thế đè lên mảng trước đó nếu có key trùng nhau. Hay ta có thể hiểu một key của mảng đầu tiên có trong nhiều hơn một mảng, thì giá trị của nó sẽ được thay thế bằng giá trị của mảng mà nó xuất hiện lần cuối cùng.

Đọc đến đây có thể bạn sẽ thấy nó giống hệt như hàm array_replace() . Tuy nhiên nếu các phần tử của các mảng truyền vào hàm đều là các mảng thì sao?

2. Cú pháp hàm array_replace_recursive() trong PHP

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

array_replace_recursive($array1, $array2, $array3...)

Trong đó thì $array1 , $array2 , $array3 chính là danh sách những mảng được truyền vào hàm. Với $array1 là mảng sẽ được sửa đổi. Những mảng còn lại là các mảng truyền vào, để so sánh key với mảng $array1 và thực hiện thay thế. Hàm này chấp nhận một danh sách các mảng làm tham số trong đó tham số đầu tiên là bắt buộc và phần còn lại là tùy chọn.

Khi giá trị trong mảng đầu tiên là vô hướng, nó sẽ được thay thế bằng giá trị trong mảng thứ hai, nó có thể là vô hướng hoặc mảng. Khi giá trị trong mảng đầu tiên và mảng thứ hai đều là mảng, array_replace_recursive() sẽ thay thế giá trị tương ứng của chúng một cách đệ quy.

Nếu ta không chỉ định key cho mỗi mảng, hàm này sẽ hoạt động giống hệt như hàm array_replace() .

Giá trị trả về sẽ là mảng đã được sửa đổi. Nếu xảy ra lỗi Null sẽ được trả về.

Ví dụ : Thay thế các giá trị của mảng đầu tiên bằng các giá trị từ mảng thứ hai một cách đệ quy

<?php
$a1=array("a"=>array("PHP"),"b"=>array("PYhon","HTML"),);
$a2=array("a"=>array("JS"),"b"=>array("SQL"));
echo '<pre>';
print_r(array_replace_recursive($a1,$a2));
?>

Kết quả

Array
(
    [a] => Array
        (
            [0] => JS
        )

    [b] => Array
        (
            [0] => SQL
            [1] => HTML
        )

)

Ta có thể thấy, nếu dùng hàm array_replace_recursive() nó sẽ chỉ tìm đến key của mảng $a1$a2 rồi thay thế chứ không quan tâm đến giá trị của phần tử đó có là mảng hay không.

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

Ví dụ 1: sử dụng với nhiều mảng

<?php
$a1=array("a"=>array("PHP"),"b"=>array("HTML","SQL"));
$a2=array("a"=>array("Java"),"b"=>array("CSS"));
$a3=array("a"=>array("Python"),"b"=>array("C++"));

echo '<pre>';
print_r(array_replace_recursive($a1,$a2,$a3));
?>

Kết quả

Array
(
    [a] => Array
        (
            [0] => Python
        )

    [b] => Array
        (
            [0] => C++
            [1] => SQL
        )

)

Vi dụ 2: Sự khác biệt giữa array_replace()array_replace_recursive()

<?php
$a1=array("a"=>array("PHP"),"b"=>array("Java","C++"),);
$a2=array("a"=>array("Python"),"b"=>array("Js"));

$result=array_replace_recursive($a1,$a2);
echo '<pre>';
print_r($result);

$result=array_replace($a1,$a2);
echo '<pre>';
print_r($result);
?>

Kết quả

Array
(
    [a] => Array
        (
            [0] => Python
        )

    [b] => Array
        (
            [0] => Js
            [1] => C++
        )

)
Array
(
    [a] => Array
        (
            [0] => Python
        )

    [b] => Array
        (
            [0] => Js
        )

)