Callback trong các hàm dựng sẵn trong PHP
Trong PHP có một số hàm dựng sẵn
mà tham số của chúng nhận callback.
Chúng ta sẽ tìm hiểu nguyên lý chung khi làm việc với chúng
thông qua ví dụ về hàm array_map.
Hàm này nhận callback làm tham số đầu tiên,
và tham số thứ hai - một mảng. Hàm áp dụng
callback cho từng phần tử của mảng
và trả về mảng đã được thay đổi.
Hãy xem xét các biến thể sử dụng hàm này với kiến thức chúng ta đã có trước đây.
Biến thể 1
Lấy căn bậc hai từ mỗi phần tử của mảng
bằng hàm dựng sẵn
sqrt.
Để làm điều này, chúng ta truyền tham số callback là
một chuỗi chứa tên của hàm đó:
<?php
$arr = [1, 2, 3, 4, 5];
$res = array_map('sqrt', $arr);
var_dump($res);
?>
Biến thể 2
Tính bình phương mỗi phần tử của mảng bằng hàm thông thường do chúng ta tạo. Để làm điều này, chúng ta truyền tham số callback là một chuỗi chứa tên hàm đó:
<?php
$arr = [1, 2, 3, 4, 5];
function func($num) {
return $num ** 2;
}
$res = array_map('func', $arr);
var_dump($res);
?>
Biến thể 3
Chuyển hàm của chúng ta thành hàm ẩn danh (anonymous function), được gán vào một biến:
<?php
$arr = [1, 2, 3, 4, 5];
$func = function ($num) {
return $num ** 2;
};
$res = array_map($func, $arr);
var_dump($res);
?>
Biến thể 4
Truyền trực tiếp hàm ẩn danh làm tham số:
<?php
$arr = [1, 2, 3, 4, 5];
$res = array_map(function ($num) {
return $num ** 2;
}, $arr);
var_dump($res);
?>
Biến thể 5
Sử dụng hàm mũi tên (arrow function):
<?php
$arr = [1, 2, 3, 4, 5];
$res = array_map(fn ($num) => $num ** 2, $arr);
var_dump($res);
?>
Biến thể 6
Bây giờ, giả sử lũy thừa mà chúng ta cần
tính cho số được xác định bởi một biến bên ngoài
callback. Chúng ta sẽ sử dụng biến này,
truy cập nó thông qua use:
<?php
$arr = [1, 2, 3, 4, 5];
$pow = 3;
$res = array_map(function ($num) use ($pow) {
return $num ** $pow;
}, $arr);
var_dump($res);
?>
Biến thể 7
Viết lại đoạn mã trước bằng hàm mũi tên.
Bây giờ biến $pow
sẽ tự động có thể truy cập được:
<?php
$arr = [1, 2, 3, 4, 5];
$pow = 3;
$res = array_map(fn ($num) => $num ** $pow, $arr);
var_dump($res);
?>
Bài tập thực hành
Cho một mảng các chuỗi. Chuyển đổi văn bản của mỗi phần tử mảng thành chữ hoa.
Cho một mảng các chuỗi. Đảo ngược văn bản của mỗi phần tử mảng sao cho các ký tự được sắp xếp theo thứ tự ngược lại.