關於數組array_diff(array1, array2)求差集來比較數組是否相等的問題細究

無意中發現很多朋友都喜歡使用array_diff(array1, array2)來判斷兩個數組是否相等,
我自己也偶爾會這麼使用
但是今天我在寫代碼的過程中無意發現這麼做是不準確的。
首先我們來看一下這個函數的釋義(PHP Manual):
對比 array1 和其他一個或者多個數字,返回在 array1 中但是不在其他 array 裏的值。
說實話讀起來有點拗口,有些朋友喜歡直接看代碼,
我們通過手冊上代碼發現兩個數組做比較可以求差集並且間接判斷相等

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
?>

這裏和我們預期的一樣,返回的結果是Array([1] => blue)
許多朋友看到這裏就結束了,
沒有去考慮如果blue元素如果是在$array2中,兩者比較會是什麼結果?
如果你用作判斷兩個數組是否相等,我告訴你這裏返回值仍然是空!
沒錯,這個函數只特麼的拿array1去和後面的做對比,返回array1中的差集,
後面的數組不是親兒子根本不管你!
不過在某種情況下也是可以使用的,比如我今天寫這部分代碼的時候:
public function register(Request $request, User $user):JsonResponse
{
    if ($request->isMethod('post')){
        $post = $request->post();
        if (array_diff(array_keys($post), ['nickname', 'mobile', 'captcha'])){
            list($nickname, $mobile, $captcha) = $post;
        }
        // TODO $user->save()
        return responseJson(ResponseEnum::REQUEST_SUCCESS_CODE, ResponseEnum::REQUEST_SUCCESS_MESSAGE);
    }else{
        return responseJson(ResponseEnum::ILLEGAL_REQUEST_CODE, ResponseEnum::ILLEGAL_REQUEST_MESSAGE);
    }
}
在這部分用戶註冊的代碼中,判斷Post過來的值是不是存在,
判斷是不是符合我入庫前將要處理的預期值,
然後一次性賦值,正好用到了此函數,於是多考慮了一下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章