PHP 8.4: Dự kiến có thêm 4 hàm mới liên quan tới Array

Phiên bản PHP tiếp theo, 8.4, dự kiến sẽ có 4 hàm mới liên quan tới việc tìm kiếm trong array, giúp rút gọn code và tăng hiệu quả xử lý.

PHP 8.4: Dự kiến có thêm 4 hàm mới liên quan tới Array
Ảnh minh họa: laravel-news.com

Có tới 4 hàm mới liên quan tới việc xử lý mảng (array) có khả năng cao sẽ xuất hiện trong PHP 8.4, mặc dù chúng vẫn đang còn ở giai đoạn biểu quyết RFC. Sở dĩ có sự kỳ vọng này là vì tất cả thành viên đều đồng ý và deadline cho việc biểu quyết là ngày 29/05/2024.

Do đó, mặc dù hội đồng chưa chốt nhưng ta hoàn toàn có thể tin rằn g PHP 8.4 sẽ là phiên bản đầu tiên mà những hàm này có mặt.

Bốn gương mặt mới là:

  • array_find()
  • array_find_key()
  • array_any()
  • array_all()

Cùng làm quen với những người bạn mới.

Hàm array_find()

Hàm array_find($array, $callback) trả về giá trị của phần tử đầu tiên trong array mà với giá trị đó, $callback trả về true.

Đoạn code ví dụ:

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
array_find($array, function (string $value) {
    return strlen($value) > 4;
}); // string(5) "goose"
 
array_find($array, function (string $value) {
    return str_starts_with($value, 'f');
}); // null
 
// Tìm con thú đầu tiên có key trùng với ký tự đầu của tên.
array_find($array, function (string $value, $key) {
   return $value[0] === $key;
});

Nếu sử dụng các helper Arr hoặc Collection của Laravel, chúng ta cũng có thể làm được điều tương tự với phương thức first() đi kèm một callback.

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
 
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
new Collection($array)
    ->first(fn ($value) => strlen($value) > 4); // goose
 
Arr::first(
    $array,
    fn ($value) => str_starts_with($value, 'f')
); // null
 
new Collection($array)
    ->first(fn ($value, $key) => $value[0] === $key); // cow

Lưu ý rằng, trong ví dụ ở trên, chúng ta đã khởi tạo một Class mà không có đóng mở ngoặc nhọn:

new Collection($array)->first();

thay vì kiểu truyền thống từ trước tới nay:

(new Collection($array))->first();

tại vì từ PHP 8.4, cách làm này khả năng cao được hỗ trợ.

Hàm array_find_key()

Hoạt động cũng giống như array_find() nhưng array_find_key($array, $callback) lại trả về key (thay vì value) của phần tử đầu tiên trong mảng mà với nó, $callback trả về true. Nếu không có ai phù hợp, những gì chúng ta nhận được chỉ là null mà thôi.

Đoạn code ví dụ:

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
array_find_key($array, function (string $value) {
    return strlen($value) > 4;
}); // string(1) "e"
 
array_find_key($array, function (string $value) {
    return str_starts_with($value, 'f');
}); // null
 
array_find_key($array, function (string $value, $key) {
   return $value[0] === $key;
}); // string(1) "c"

Nếu sử dụng Collection của Laravel, bạn có thể làm điều tương tự với phương thức search() kết hợp với một closure. Tuy nhiên, search() sẽ trả về false chứ không phải null nếu không tìm thấy kết quả nào.

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
 
new Collection($array)->search(function (string $value) {
    return strlen($value) > 4;
}); // string(1) "e"
 
new Collection($array)->search(function (string $value) {
    return str_starts_with($value, 'f');
}); // false
 
new Collection($array)->search(function (string $value, $key) {
   return $value[0] === $key;
}); // string(1) "c"

Hàm array_any()array_all()

Phần thứ hai của RFC này là đề xuất bổ sung hai hàm: array_any()array_all().

  • Hàm array_any($array, $callback) sẽ trả về true nếu có BẤT KỲ phần tử nào của mảng làm cho $callback trả về true
  • Hàm array_all($array, $callback) sẽ chỉ trả về true nếu TẤT CẢ phần tử của mảng đều làm cho $callback trả về true
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
// Check xem có tên con thú nào có nhiều hơn 5 ký tự không
array_any($array, function (string $value) {
    return strlen($value) > 5;
}); // bool(true)
 
// Check xem có tên con thú nào có ít hơn 3 ký tự không
array_any($array, function (string $value) {
    return strlen($value) < 3;
}); // bool(false)
 
// Xác nhận rằng tất cả con thú đều có tên ít hơn 12 ký tự
array_all($array, function (string $value) {
    return strlen($value) < 12;
}); // bool(true)
 
// Xác nhận rằng tất cả con thú đều có tên nhiều hơn 5 ký tự
array_all($array, function (string $value) {
    return strlen($value) > 5;
}); // bool(false)

Đọc thêm

Bạn có thể đọc đầy đủ nội dung (tiếng Anh) của RFC này tại đây. Với mức độ tán thành tuyệt đối, có khả năng rất cao chúng sẽ xuất hiện trong PHP 8.4. Bạn cũng có thể xem nháp của đoạn code phục vụ cho việc này trong core của PHP tại GitHub.

PHP 8.4 dự kiến ra mắt chính thức vào ngày 21 tháng 11 năm 2024.


Nguồn: