首先還是從代碼來看,我們通過比較運算子號來對兩個陣列進行比較:
var_dump([1, 2] == [2, 1]); // false
var_dump([1, 2, 3] > [3, 2, 1]); // false
var_dump([5, 6, 7] > [1, 2, 3, 4]); // false
第一組:仔細看,從一眼看過去的正常角度來說,代碼中對比的陣列其實是一樣的陣列,[1, 2]和[2, 1]都是兩個包含兩個元素的陣列,元素內容也是一樣的,但是,他們的位置不一樣,
第二組:同樣是位置不一樣,[1, 2, 3]是小于[3, 2, 1]的
第三組:[5, 6, 7]每個元素都大于[1, 2, 3, 4],但結果是沒有后一個陣列大,
相信不少同學已經看出一些端倪了,陣列之間的運算子比較是先進行元素數量對比,然后再對比每個鍵值,官方檔案上的解釋為:
具有較少成員的陣列較小,如果運算元 1 中的鍵不存在于運算元 2 中則陣列無法比較,否則挨個值比較
<?php
// 陣列用標準比較運算子這樣比較的
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // uncomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
上述代碼就是php中使用比較運算子進行陣列比較時的代碼,首先是count陣列的元素數量,如果陣列1大于陣列2就回傳1,否則回傳-1,如果相等的話,遍歷每一個元素進行對比,如果陣列1的某個鍵值不存在在陣列2中,回傳null,如果陣列1的某個鍵的值大于陣列2的這個鍵的值,回傳1,否則回傳-1,遍歷的元素也都相同的情況下,最后回傳0表示相等,
使用普通的比較運算子對比鍵值對形式的陣列效果會好一些,因為是以固定的鍵來進行比對,不是以陣列下標:
var_dump(['a'=>1, 'b'=>2] == ['b'=>2, 'a'=>1]); // ture
var_dump(['a'=>1, 'b'=>2] == ['a'=>2, 'b'=>1]); // false
var_dump(['a' => 1, 'b' => 5] < ['a' => 2, 'b' => 1]); // true
注意第三條比較,我們的第一個陣列的b元素是大于第二個陣列的,但通過上面的陣列比較代碼可以看出,當第一個元素比較結果已經出現了大于小于的情況時,直接就return回傳了結果,后面的元素不會再進行比較了,
那么多維陣列呢?
var_dump([['aa' => 1], ['bb' => 1, 'dd'=>2]] == [['aa' => 2], ['bb' => 1]]); // false
var_dump([['aa' => 1], ['bb' => 1, 'dd'=>2]] < [['aa' => 2], ['bb' => 1]]); // true
var_dump([['aa' => 1], ['bb' => 1, 'dd'=>2]] < [['aa' => 1, 'cc' => 1], ['bb' => 1]]); // true
子陣列會遞回進行比較,比較規則依然是按照默認的陣列運算子比較方式進行,
弄清楚了陣列的比較是如何進行的,那么問題來了,假設前端傳給我們的資料是這樣的:
[
'John',
'178cm',
'62kg',
]
而我們資料庫里存的是:
[
'62kg',
'John',
'178cm',
]
這時如果直接比對兩個陣列內容,或者直接用json字串比對,他們都是不相同的,這可怎么辦呢?試試自定義一個對比方法吧!
function array_equal($a, $b)
{
return (is_array($a) && is_array($b) && array_diff($a, $b) === array_diff($b, $a));
}
$arr1 = [
'John',
'178cm',
'62kg',
];
$arr2 = [
'62kg',
'John',
'178cm',
];
var_dump(array_equal($arr1, $arr2)); // true
// 元素不一樣的話
$arr2 = [
'62kg',
'John Jobs',
'178cm',
];
var_dump(array_equal($arr1, $arr2)); // false
// 再弄亂一點
$arr1 = [
[
'55kg',
'Bob',
'172cm',
[
'employee',
],
],
[
'John',
'178cm',
'62kg',
[
'manager',
],
],
];
$arr2 = [
[
'62kg',
'John',
'178cm',
[
'manager',
],
],
[
[
'employee',
],
'55kg',
'172cm',
'Bob',
],
];
var_dump(array_equal($arr1, $arr2)); // true
其實就是利用了array_diff()這個函式,它的作用是取兩個陣列的差集,然后再對比兩個陣列差集的結果來判斷兩個陣列是否相等,這個方法適用于下標陣列的比對,但不適用于鍵值對陣列的比對,array_diff()只是取值的差集結果集,不會比對鍵,所以對于鍵值對的陣列直接使用比較運算子就好啦!
對于陣列的比較我們只要弄清楚它的原理就可以了,如果原理不清楚很可能就會埋下隱藏的BUG,陣列的比較一定要記住這三點:
1.先比較元素數量
2.再比較每一個元素(多維陣列遞回比較)
3.先后順序,第一個有比較結果了后面就不會繼續比較了,全部都相等才會回傳相等
測驗代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/PHP%E4%B8%AD%E6%AF%94%E8%BE%83%E6%95%B0%E7%BB%84%E7%9A%84%E6%97%B6%E5%80%99%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.php
參考鏈接:https://www.php.net/manual/zh/language.operators.comparison.php
===============
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246734.html
標籤:PHP
上一篇:BindingResult的使用
