對陣列元素進行去重,我們一般會使用array_unique方法,使用這個方法可以把陣列中的元素去重。
<?php
$arr = array(1,1,2,3,3,3,4,4,5,6,6,7,8,8,9,9,9);
$arr = array_unique($arr);
$arr = array_values($arr);
print_r($arr);
?>
輸出:
array
( [0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
)
去重後,鍵值會不按順序,可以使用 array_values() 函式把鍵值重新排序(即只取陣列中的 value,key 重新生成 0,1,2,3……..)。
<?php
$arr = array();
// 建立100000個隨機元素的陣列
for($i=0; $i
<100000; $i++)
// 記錄開始時間
$starttime = getmicrotime();
// 去重
$arr = array_unique($arr);
// 記錄結束時間
$endtime = getmicrotime();
$arr = array_values($arr);
echo
'unique count:'.count($arr).'
'; echo
'run time:'.(float)(($endtime-$starttime)*1000).'ms
'; echo
'use memory:'.getusememory();
/*** 獲取使用記憶體
*@return float
*/function
getusememory
() /**
* 獲取microtime
*@return float
*/function
getmicrotime
()?>
unique count:99
run time:653.39303016663ms
use memory:5120kb
使用 array_unique 方法去重,執行時間需要約 650ms,記憶體占用約 5m
上面是原作者的結果,由於我的環境是 ubuntu + php7,因此結果不一樣:
unique count:99
run time:266.930103302ms
use memory:2048kb
執行時間需要約 270ms,記憶體占用約 2m
php 有乙個鍵值互換的方法 array_flip(),我們可以使用這個方法去重,因為鍵值互換,原來重複的值會變為相同的鍵,由於鍵值必須唯一,因此能夠達到去重的目的。
然後再進行一次鍵值互換,把鍵和值換回來則可以完成去重。
<?php
$arr = array();
// 建立100000個隨機元素的陣列
for($i=0; $i
<100000; $i++)
// 記錄開始時間
$starttime = getmicrotime();
//$arr = array_unique($arr);
// 使用鍵值互換去重
$arr = array_flip($arr);
$arr = array_flip($arr);
// 記錄結束時間
$endtime = getmicrotime();
//重新生成鍵值
$arr = array_values($arr);
echo
'unique count:'.count($arr).'
'; echo
'run time:'.(float)(($endtime-$starttime)*1000).'ms
'; echo
'use memory:'.getusememory();
/*** 獲取使用記憶體
*@return float
*/function
getusememory
() /**
* 獲取microtime
*@return float
*/function
getmicrotime
()?>
unique count:99
run time:12.840032577515ms
use memory:768kb
使用array_flip方法去重,執行時間需要約13ms,記憶體占用約2m
上面是原作者的結果,由於我的環境是 ubuntu + php7,因此結果不一樣:
unique count:99
run time:5.2969455718994ms
use memory:2048kb
執行時間需要約 5ms,記憶體占用約 2m
因此使用 array_flip 方法去重比使用 array_unique 方法執行時間減少98%,記憶體占用減少4/5;
可以發現,使用了 array_flip() 函式,效率提高幅度很大。
除了上面的方法外,我們還可以使用 array_keys() 函式,就是將上面**中的:
// 使用鍵值互換去重
$arr = array_flip($arr);
$arr = array_flip($arr);
// 記錄結束時間
$endtime = getmicrotime();
//重新生成鍵值
$arr = array_values($arr);
換成:
$arr = array_flip($arr);
$arr = array_keys($arr);
$endtime = getmicrotime();
即可。
array_keys(),取陣列的所有 key 作為 value 重新組成陣列。
執行結果:
unique count:99
run time:5.2149295806885ms
use memory:2048kb
與 array_flip() 基本不發生變化,當然,我沒有看過這兩個函式的原始碼,不能確切的說哪個方法更好。
總的來說,比 array_unique() 的效能好的不是一點點。
本部落格參考(90%+)自
php 陣列去重
一維陣列的重複項 使用array unique函式即可,使用例項如下 bb array unique aa print r bb 二維陣列的重複項 對於二維陣列咱們分兩種情況討論,一種是因為某一鍵名的值不能重複,刪除重複項 另一種因為內部的一維陣列不能完全相同,而刪除重複項,下面舉例說明 因為某一鍵...
php 陣列去重
一維陣列的重複項 使用array unique函式即可,使用例項如下 bb array unique aa print r bb 二維陣列的重複項 對於二維陣列咱們分兩種情況討論,一種是因為某一鍵名的值不能重複,刪除重複項 另一種因為內部的一維陣列不能完全相同,而刪除重複項,下面舉例說明 因為某一鍵...
PHP陣列去重
建立乙個包含重複值的,一共四個元素的陣列 array array green blue orange blue 翻轉陣列,你將會得到唯一鍵值的陣列 array array flip array 然後再翻轉一次,將鍵和值重新放置 array array flip array print r array...