無意中發現很多朋友都喜歡使用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);
}
}