1. Hàm array_udiff() trong PHP

Hàm array_udiff() trong PHP được sử dụng để so sánh hai hay nhiều mảng trong PHP. Hàm này sẽ so sánh các value của hai nhiều mảng với nhau và trả về sự khác biệt. Việc so sánh ở đây sẽ dựa vào một hàm callback do người dùng truyền vào để so sánh dữ liệu và trả về một mảng chứa tất cả value từ mảng đầu tiên mà không có mặt trong các mảng khác. Nếu tất cả giá trị trong các mảng đều giống nhau thì hàm sẽ trả về Null . Hàm array_udiff() được giới thiệu và sử dụng từ phiên bản PHP 5.1.0

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

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

array_udiff($array1, $array2, $array3,...,myfunction)

Trong đó :

  • $array1 : mảng ban đầu được truyền vào để so sánh với những mảng khác. Tham số này là bắt buộc trong hàm
  • $array2 : mảng được so sánh với mảng $array1. Tham số này là bắt buộc trong hàm
  • $array3 : mảng được so sánh với $array1. Tham số này là không bắt buộc có trong hàm
  • myfunction : hàm callback do người dùng truyền vào. Hàm so sánh phải trả về một số nguyên nhỏ hơn, bằng hoặc lớn hơn 0 nếu đối số đầu tiên được coi là tương ứng nhỏ hơn, bằng hoặc lớn hơn đối số thứ hai.

Hàm tích hợp array_udiff() để so sánh các key của một mảng và hàm do người dùng xác định để so sánh các giá trị value . Các key sẽ được giữ nguyên theo mảng $array1 ban đầu

Giá trị trả về là một mảng chứa các giá trị của $array1 không có trong các mảng khác. Nếu tất cả các giá trị value có trong các mảng khác, hàm trả về Null.

Hàm này cũng sẽ chỉ kiểm tra một chiều của mảng đa chiều. Nếu muốn kiểm tra sâu hơn trong mảng đa chiều ta sẽ sử dụng cú pháp sau:

array_udiff($array1[0], $array2[0], "myfunction");

Ví dụ : so sánh các giá trị của hai mảng (sử dụng một hàm do người dùng xác định để so sánh các giá trị) và trả về sự khác biệt

<?php
function myfunction($a,$b)
{
if ($a===$b)
  {
  return 0;
  }
  return ($a>$b)?1:-1;
}

$a1=array("a"=>"PHP","b"=>"Java","c"=>"Python");
$a2=array("a"=>"HTML","b"=>"Java","e"=>"CSS");

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

Kết quả

Array
(
    [a] => PHP
    [c] => Python
)

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

Ví dụ 1: so sánh các giá trị của ba mảng (sử dụng một hàm do người dùng xác định để so sánh các giá trị) và trả về sự khác biệt

<?php
function myfunction($a,$b)
{
if ($a===$b)
  {
  return 0;
  }
  return ($a>$b)?1:-1;
}

$a1=array("a"=>"red","b"=>"green","c"=>"blue","yellow");
$a2=array("A"=>"red","b"=>"GREEN","yellow","black");
$a3=array("a"=>"green","b"=>"red","yellow","black");

$result=array_udiff($a1,$a2,$a3,"myfunction");
print_r($result);
?>

Kết quả

Array ( [c] => blue )

Trong ví dụ ta đã truyền vào hàm so sánh chặt chẽ các giá trị ( (string) $elem1 === (string) $elem2 ) . Và ở đây nó sẽ không phân biệt chữ hoa hay chữ thường. Và khi so sánh nhiều hơn 2 mảng trở lên thì chỉ cần giá trị của mảng ban đầu giống với giá trị của một mảng sau thôi cũng sẽ không thỏa mãn và bị loại. Chỉ có giá trị không giống với bất kỳ giá trị nào trong các mảng còn lại mới thỏa mãn và được in ra.

Ví dụ 2: so sánh các giá trị của bốn mảng (sử dụng một hàm do người dùng xác định để so sánh các giá trị) và trả về sự khác biệt

<?php
function arr_udiffFunction($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b) ? 1 : -1;
}
$arr1 = array(
    "a" => "C",
    "b" => "C++",
    "d" => "Java",
    "r" => "PHP"
);
$arr2 = array(
    "a" => "C",
    "y" => "C++",
    "d" => "Java",
    "r" => "Python"
);
$arr3 = array(
    "a" => "C#",
    "n" => "Android",
    "d" => "Python",
    "r" => "HTML"
);
$arr4 = array(
    "a" => "Objective C",
    "y" => "C++",
    "d" => "Java",
    "r" => "Perl"
);

$result = array_udiff($arr1, $arr2, $arr3, "arr_udiffFunction");
print_r($result);
?>

Kết quả

Array ( [r] => PHP )

Ví dụ 3:

<?php
// mảng để so sánh
$array1 = array(new stdclass, new stdclass,
                new stdclass, new stdclass,
               );

$array2 = array(
                new stdclass, new stdclass,
               );

// Đặt một số thuộc tính cho từng đối tượng
$array1[0]->width = 11; $array1[0]->height = 3;
$array1[1]->width = 7;  $array1[1]->height = 1;
$array1[2]->width = 2;  $array1[2]->height = 9;
$array1[3]->width = 5;  $array1[3]->height = 7;

$array2[0]->width = 7;  $array2[0]->height = 5;
$array2[1]->width = 9;  $array2[1]->height = 2;

function compare_by_area($a, $b) {
    $areaA = $a->width * $a->height;
    $areaB = $b->width * $b->height;
    
    if ($areaA < $areaB) {
        return -1;
    } elseif ($areaA > $areaB) {
        return 1;
    } else {
        return 0;
    }
}

echo '<pre>';
var_dump(array_udiff($array1, $array2, 'compare_by_area'));
?>

Kết quả

array(2) {
  [0]=>
  object(stdClass)#1 (2) {
    ["width"]=>
    int(11)
    ["height"]=>
    int(3)
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["width"]=>
    int(7)
    ["height"]=>
    int(1)
  }
}