1. Hàm array_filter() trong PHP

Hàm array_filter() trong PHP giúp ta lọc các giá trị của mảng bằng cách sử dụng một hàm callback (hàm gọi lại) . Nó sẽ duyệt qua mỗi value trong mảng input đang truyền tới hàm callback . Có nghĩa là nó sẽ lặp lại từng giá trị trong mảng, chuyển chúng tới hàm do người dùng xác định hoặc hàm gọi lại. Ta có thể truyền mảng vào như là tham số đầu tiên và một hàm ẩn danh làm tham số thứ hai. Nếu như hàm callback trả về True thì value hiện tại của mảng input sẽ được trả về trong mảng kết quả và key của mảng được giữ nguyên. Với cách này khi key của mảng input được giữ nguyên thì có nghĩa là key của mảng input và mảng kết quả là giống nhau.

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

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

array_filter($array, $callback_function, $flag)

Trong đó :

  • $array : chính là mảng đầu vào mà hàm array_filter() sẽ thao tác . Tham số này là bắt buộc.
  • $callback_function : đề cập đến hàm do người dùng tự xác định và truyền vào. Nếu hàm callback không được cung cấp, thì tất cả đầu vào của mảng input mà tương đương với FALSE sẽ bị xóa. Tham số này không bắt buộc
  • $flag : xác định đối số nào được gửi đến hàm callback.

Với $flag nó có thể một trong mode :

  • ARRAY_FILTER_USE_KEY : chuyển key thành đối số duy nhất cho một hàm callback thay vì value của mảng
  • ARRAY_FILTER_USE_BOTH : chuyển cả valuekey làm đối số để gọi lại thay vì value của mảng

Mặc định là 0 sẽ chuyển giá trị làm đối số duy nhất để gọi lại thay thế. Cuối cùng một mảng được lọc được trả về.

Ví dụ:

<?php
function Even($array){
   if($array%2==0)
    return TRUE;
   else
    return FALSE;
 }

$array = array(12, 0, 0, 18, 27, 0, 46);
echo '<pre>';
print_r(array_filter($array, "Even"));

?>

Kết quả

Array
(
    [0] => 12
    [1] => 0
    [2] => 0
    [3] => 18
    [5] => 0
    [6] => 46
)

Ở ví dụ này ta sử dụng hàm array_filter() để lọc ra mảng mới với value là những số chẵn ở mảng cũ. Trước tiên bạn có thể thấy rằng hàm callback là hàm tìm ra số chia hết cho 2 trong mảng $array . Lúc này giá trị là số chẵn sẽ là True và được giữ lại sau đó được in ra mảng mới(kể cả số 0). Ngược lại số không phải số chẵn mang giá trị False và bị xóa.

Tuy nhiên cũng là ví dụ như trên nhưng mình sẽ không truyền hàm callback :

<?php

function Even($array)
{
  if($array%2==0)
    return TRUE;
  else
    return FALSE;
}

$array = array(12, 0, 0, 18, 27, 0, 46);
echo '<pre>';
print_r(array_filter($array));

?>

Kết quả

Array
(
    [0] => 12
    [3] => 18
    [4] => 27
    [6] => 46
)

Như ta có thể thấy rằng phần tử 0 hoặc False sẽ không được in ra.

Chú ý

Nếu mảng được thay đổi từ hàm gọi lại (ví dụ như thêm, xóa, không được đặt,…) thì hành động của hàm là không xác định.

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

Ví dụ 1: Tạo 1 mảng số lẻ lọc từ mảng int có sẵn

  • Sử dụng hàm array_filter()
<?php

$numbers = [1, 2, 3, 4, 5];
$oddNumbers = array_filter($numbers,function ($value){
    return $value % 2 != 0;
});

print_r($oddNumbers);

?>

  • Sử dụng vòng lặp
<?php

$numbers = [1, 2, 3, 4, 5];
$oddNumbers = [];
foreach ($numbers as $number) {
    if ($number % 2 != 0) {
        $oddNumbers[] = $number;
    }
}

print_r($oddNumbers);

?>

Kết quả

Array ( [0] => 1 [1] => 3 [2] => 5 )

Ta có thể thấy việc lọc bằng vòng lặp này chính là phương thức lọc của hàm array_filter() . Vì vậy khi muốn lọc phần tử của một mảng thì hãy suy nghĩ cách dùng array_filter() thay vì dùng mảng tạm hay vòng lặp nhé.

Ví dụ 2: Lọc một mảng không tuần tự dựa trên keyvalue

<?php

$inputs = [
    'first'    => 'PHP',
    'last'     => 'Program',
    'password' => 'laptrinhtudau',
    'email'    => ''
];

$filtered = array_filter($inputs, function ($value, $key) {
    return !empty($value) && $key !== 'password';
}, ARRAY_FILTER_USE_BOTH);
echo '<pre>';
print_r($filtered); 
?>

Kết quả

Array
(
    [first] => John
    [last] => Doe
)

Với hàm được truyền vào có giá trị trả về với việc value có giá trị và key không phải password . Ta sử dụng mode ARRAY_FILTER_USE_BOTH  để giúp callback nhận được cả key và value

Ví dụ 3:

<?php  

$values=['laptrinhtudau','',10,0,false,"2022",null,true];  
$filtered = array_filter($values);  
echo '<pre>';
print_r($filtered);  
          
?>

Kết quả

Array
(
    [0] => laptrinhtudau
    [2] => 10
    [5] => 2022
    [7] => 1
)

Ở đây hàm array_filter() sẽ loại bỏ những giá trị False. Mà ta thấy trong mảng có giá trị rỗng là False, False là False, null là False. Vì vậy mà mảng mới được lọc sẽ có value là những giá trị True là: laptrinhtudau , 10 , 2022 , 1.