-
-
function array_diff($array_1, $array_2) {
- $diff = array();
foreach ($array_1 as $k => $v1) {
- $flag = false;
- foreach ($array_2 as $v2) {
- if ($flag = ($ v1 == $v2)) {
- break;
- }
- }
if (!$flag) {
- $diff[$k] = $v1 ;
- }
- }
return $diff;
- }
- ?>
-
-
複製程式碼
以上程式碼的實現,有點牽強。
於是我又重新考慮了下,並優化了演算法,第二個函數看起來是這個樣子的:
-
-
function array_diff($array_1, $array_2) {
- foreach ($array_1as askey => $item) {
- if (in_array($item, $array_2, true)) {
- unset($array_1[$key]);
- }
- }
return $array_1;
- }
- ?>
-
-
複製程式碼
這次幾乎可以和原array_diff 函數的速度媲美了。
但是還有沒有更優化的方法呢?
發現 PHP 竟然可以這樣寫:
-
-
function array_diff($array_1, $array_2) {
- $array_2 = array_hey_2) {
- $array_2 = array_yf );
- foreach ($array_1 as $key => $item) {
- if (isset($array_2[$item])) {
- unset($array_1[$key]);
- }
- }
return $array_1;
- }
- ?>
-
複製程式碼
這個函數的效率非常的驚人,甚至比原 array_diff 函數的速度都要快。究其原因,我找到了解釋:
因為關鍵是進行 HASH 組織的,所以查找很快;
而 Value 只是由 Key 組織存放,本身沒有索引,每次查找都是遍歷。總結
這雖然是 PHP 語言的一個小竅門,但在遍歷和對比數組的值上,如果需要對比值將其與鍵反轉的確比通常的值對值的比較效率要高得多。
例如,上面的函數二需要呼叫 in_array 函數需要循環判斷是否在函數內;而函數三則僅僅判斷這個數組是否存在該鍵就可以了。加上數組鍵和值不同的組織索引方式,效率比想像的還高那就非常可以理解了。
完整程式碼如下:
-
-
function microtime_float() {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
- }
function array_diff2($array_1, $array_2) {
- $diff = array();
foreach ($array_1 as $k => $v1) {
- $flag = false;
- foreach ($array_2 as $v2 ) {
- if ($flag = ($v1 == $v2)) {
- break;
- }
- }
if (!$flag) {
- $diff[$k] = $v1;
- }
- }
return $diff;
- }
- function array_diff3($array_1, $array_2) {
- foreach ($array_1 as $key => $item) {
- if (in_array($item, $array_2, true)) {
- unset( $array_1[$key]);
- }
- }
return $array_1;
- }
- function array_diff4( $array_1, $array_2) {
- $array_2 = array_flip($array_2);
- foreach ($array_1 as $key => $item) {
- if (isset($array_2[$item])) {
- unset($array_1[$key]);
- }
- }
return $array_1;
- }
//////////////////////////////
for($i = 0, $ary_1 = array(); $i $ary_1[] = rand(100, 999);
- }
for($i = 0, $ ary_2 = array(); $i $ary_2[] = rand(100, 999);
- }
header("Content-type : text/plain;charset=utf-8");
$time_start = microtime_float();
- array_diff($ary_1, $ary_2);
- echo "array_diff 運行函數" . (microtime_float() - $time_start) . " 秒n";
$time_start = microtime_float();
- array_diff2($ary_1, $ary_2);
- echo "函數array_diff2 運行" . (microtime_float() - $time_start) . " 秒n";
$time_start = microtime_float();
- array_diff3($ary_1, $ary_2);
- >echo "函數array_diff3 運行" . (microtime_float() - $time_start) . " 秒n";
$time_start = microtime_float();
- array_diff4($ary_1, $ary_2) ;
- echo "函數array_diff4 運行" . (microtime_float() - $time_start) . " 秒n";
- ?>
-
複製程式碼
|