PHP中有一種數據類型非常重要,它就是關聯數組,又稱為哈希表(hash table),是一種非常好用的數據結構。
在程序中,我們可能會遇到需要消重的問題,舉一個最簡單的模型:
有一份用戶名列表,存儲了 10000 個用戶名,沒有重復項;
還有一份黑名單列表,存儲了 2000 個用戶名,格式與用戶名列表相同;
現在需要從用戶名列表中刪除處在黑名單裡的用戶名,要求用盡量快的時間處理。
這個問題是一個小規模的處理量,如果實際一點,2 個表都可能很大,比如有 2 億條記錄。
我最開始想到的方法,就是做一個嵌套的循環,設用戶名表有 M 條記錄,黑名單列表有 N 條記錄,那麼,循環的次數是 M * N 次!
PHP 版代碼:
<?php foreach($arrayM as $keyM => $nameM) { foreach($arrayN as $nameN) { if ($nameM == $nameN) { // 本行執行了 M * N 次! unset($arrayM[$keyM]); } } } return $arrayM; ?>
另一種方式,利用數組索引。
PHP 是一種弱類型的語言,不像 C 語言那樣有嚴格的變量類型限制。C 語言的數組,每一個元素的類型必須一致,而且索引都是從 0 開始。
PHP 的數組,可以用字符串作為索引,也稱為關聯數組。
數組索引,有一個天然的限制就是不會重復,而且訪問的時候不需要查找,可以直接定位。
還是剛才的那個問題,我們采用另一種辦法。
把黑名單列表的用戶名組織到一個數組裡,數組的索引就是用戶名。
然後,遍歷用戶列表的時候,只需直接用 isset 查詢那個用戶名是否存在即可。
查看本欄目