1. Hàm array_diff_uassoc() trong PHP

Hàm array_diff_uassoc() trong PHP cũng dùng để so sánh mảng. Như ta đã học ở bài bài trước với những hàm so sánh mảng. Các hàm này đều so sánh theo kiểu toán tử bằng. Nhưng với hàm array_diff_uassoc() lại so sánh mảng và trả về mảng phần tử theo điều kiện của hàm mà ta truyền vào. Hàm này sẽ so sánh cả keyvalue giữa một hoặc nhiều mảng với nhau và trả về các phần tử từ mảng đầu tiên không có trong phần còn lại của mảng. Các key được so sanh theo hàm của ta truyền vào. Đây là điều khác biệt lớn nhất so với hàm array_diff() hay array_diff_assoc() mà ta đã tìm hiểu ở những bài trước.

Tóm lại ta có thể hiểu một cách nôm na rằng hàm array_diff_uassoc() này cũng giống như hàm array_diff_assoc(). Chỉ khác là nó có thêm callback mà thôi. Nếu còn chưa rõ callback trong PHP là gì các bạn có thể thao khảo thêm tại Hàm gọi lại trong PHP

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

Ta có cú pháp của hàm array_diff_uassoc() sẽ hơi phức tạp hơn những hàm so sánh ta đã tìm hiểu những bài trước.

array_diff_uassoc ($array1 ,$array2,$array3,...,$key_compare_func )

Trong đó:

  • array1 : Bắt buộc. Mảng nguồn để mảng khác so sánh với
  • array2 : Bắt buộc. Một mảng để được so sánh với mảng nguồn
  • array3 : Tùy ý. Một mảng để được so sánh với mảng nguồn
  • key_compare_func : Bắt buộc. Đây chính là một hàm callback do người dùng định nghĩa. Nếu kết quả nó trả về True thì phần tử lượt kiểm tra đó được chọn, ngược lại sẽ không được chọn và hàm này so sánh các $key thay vì value :
  • Hàm này phải trả về 0 nếu $key1 = $key2, lớn hơn 0 nếu $key1 > $key2 và bé hơn 0 nếu $key1 < $key2
  • Sự so sánh dựa vào thứ tự trong mã ASCII

Hàm này sẽ trả về một mảng mà key của mảng chỉ tồn tại ở $array1 và không tồn tại ở các array còn lại.

Ví dụ:

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

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_uassoc($array1, $array2, "key_compare_func");
print_r($result);
?>

Trong ví dụ này có thể thấy key bkey c không tồn tại ở các mảng còn lại. Còn trường hợp red ở mảng số 1 có key0 còn ở mảng số 2 key1 nên vẫn được cho là trường hợp khác biệt.

Kết quả

Array ( [b] => brown [c] => blue [0] => red )

Trong ví dụ này hàm key_compare_func sẽ có hai tham số truyền vào là $a$b chính là các key lần lượt là key của mảng thứ nhất trong danh sách tham số truyền vào và các key của mảng còn lại. Nếu hàm trả về khác 0 (lớn hơn 0 hoặc bé hơn 0) thì phần tử của lượt đó được chọn.

Sự bằng nhau của 2 tham số valuekey sẽ phụ thuộc vào callback mà người dùng truyền vào. Và cú pháp trên cũng sẽ chỉ kiểm tra được một chiêu của mảng đa chiều. Nếu muốn kiểm tra sâu hơn về mảng đa chiều ta sử dụng cú pháp sau:

array_diff_uassoc($array1[0], $array2[0], "key_compare_func");

Ví dụ:

<?php
  function user_function($a, $b){
    if ($a===$b){
        return 0;
       }
    return ($a>$b)? 1: -1;
  }
  $a1 = array(array("a" => "green", "b" => "yellow", "c" => "white", "black"), "b" => "brown", "c" => "blue", "red");
  $a2 = array(array("a" => "green", "b" => "yellow", "white", "d" => "black"), "yellow", "red");

  $result = array_diff_uassoc($a1[0], $a2[0], "user_function");
    
  print_r($result);
?>

Kết quả

Array ( [c] => white [0] => black )

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

Ví dụ 1: so sánh keyvalue của ba mảng

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

$a1=array("a"=>"red","b"=>"green","c"=>"blue");
$a2=array("a"=>"red","b"=>"green","d"=>"blue");
$a3=array("e"=>"yellow","a"=>"red","d"=>"blue");

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

Kết quả

Array ( [c] => blue )

Ví dụ 2:

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

$a1 = array(10=>"PHP", 20=>"Java", 30=>"Python");
$a2 = array(20=>"PHP", 10=>"Java", 30=>"Python");

$result=array_diff_uassoc($a1, $a2, "user_function");
print_r($result);
?>

Kết quả

Array ( [20] => Java [30] => Python )