亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深思 PHP 數(shù)組遍歷的差異(array_diff 的實現(xiàn))

 更新時間:2008年03月23日 17:46:36   作者:  
還是部門無聊的考題,不過這次考的是 PHP 的能力。題目如下: 給你兩個分別有 5000 個元素的數(shù)組,計算他們的差集 -- 說白了也就是用 PHP 和你認為最好的算法實現(xiàn) array_diff 的算法。初次接到這個題目,我發(fā)現(xiàn)這非常的簡單,于是按照以往的經(jīng)驗“隨便”寫了一個:
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;
}雖然實現(xiàn)是可以的,但是發(fā)現(xiàn)這個函數(shù)的效率是慘不忍睹。于是我又重新考慮了下,并優(yōu)化了算法,第二個函數(shù)看起來是這個樣子的:

function array_diff($array_1, $array_2) {
    foreach ($array_1 as $key => $item) {
        if (in_array($item, $array_2, true)) {
            unset($array_1[$key]);
        }
    }

    return $array_1;
}嗯,這次幾乎可以和原 array_diff 函數(shù)的速度媲美了。但是還有沒有更優(yōu)化的辦法呢?由 ChinaUnix 上的一篇文章(不好意思,作弊了),我發(fā)現(xiàn) PHP 竟然可以這樣寫:

function array_diff($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;
}這個函數(shù)的效率非常的驚人,甚至比原 array_diff 函數(shù)的速度都要快。究其原因,我找到了解釋:

因為鍵是進行 HASH 組織的,查找很快;
而 Value 只是由 Key 組織存放,本身沒有索引,每次查找都是遍歷。總結(jié)
這雖然是 PHP 語言的一個小竅門,但在遍歷和對比數(shù)組的值上,如果需要對比值將其與鍵反轉(zhuǎn)的確比通常的值對值的比較效率要高得多。

比如,上面的函數(shù)二需要調(diào)用 in_array 函數(shù)需要循環(huán)判斷是否在函數(shù)內(nèi);而函數(shù)三則僅僅判斷這個數(shù)組是否存在該鍵就可以了。加上數(shù)組鍵和值不同的組織索引方式,效率比想象的還高那就非常可以理解了。

附代碼
復(fù)制代碼 代碼如下:

<?php
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 < 5000; $i++) {
    $ary_1[] = rand(100, 999);
}

for($i = 0, $ary_2 = array(); $i < 5000; $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 "函數(shù) array_diff 運行" . (microtime_float() - $time_start) . " 秒\n";

$time_start = microtime_float();
array_diff2($ary_1, $ary_2);
echo "函數(shù) array_diff2 運行" . (microtime_float() - $time_start) . " 秒\n";

$time_start = microtime_float();
array_diff3($ary_1, $ary_2);
echo "函數(shù) array_diff3 運行" . (microtime_float() - $time_start) . " 秒\n";

$time_start = microtime_float();
array_diff4($ary_1, $ary_2);
echo "函數(shù) array_diff4 運行" . (microtime_float() - $time_start) . " 秒\n";
?>


相關(guān)文章

  • 深入研究PHP中的preg_replace和代碼執(zhí)行

    深入研究PHP中的preg_replace和代碼執(zhí)行

    這篇文章主要給大家介紹了關(guān)于PHP中preg_replace和代碼執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • PHP正則匹配到2個字符串之間的內(nèi)容方法

    PHP正則匹配到2個字符串之間的內(nèi)容方法

    今天小編就為大家分享一篇PHP正則匹配到2個字符串之間的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • php生成隨機驗證碼圖片的示例代碼

    php生成隨機驗證碼圖片的示例代碼

    這篇文章主要介紹了php生成隨機驗證碼圖片的示例代碼,結(jié)合實例形式分析了php生成隨機驗證碼圖片的實現(xiàn)方法與相關(guān)操作注意事項,文中有詳細的代碼示例,需要的朋友可以參考下
    2023-09-09
  • 詳解PHP的Yii框架中日志的相關(guān)配置及使用

    詳解PHP的Yii框架中日志的相關(guān)配置及使用

    這篇文章主要介紹了PHP的Yii框架中日志的相關(guān)配置及使用,包括bug追蹤以及數(shù)據(jù)庫查詢耗時記錄等,需要的朋友可以參考下
    2015-12-12
  • php實現(xiàn)多城市切換特效

    php實現(xiàn)多城市切換特效

    本文給大家主要分享的是在PHP中如何獲取用戶IP地址、PHP根據(jù)IP判斷用戶所在城市以及PHP根據(jù)IP實現(xiàn)城市切換或跳轉(zhuǎn)的問題。
    2015-08-08
  • PHP借助phpmailer發(fā)送郵件

    PHP借助phpmailer發(fā)送郵件

    phpmailer是一款免費的php郵件發(fā)送插件,我們可以利用phpmailer登錄到我們指定的郵件然后再利用這個郵件給我們自動發(fā)郵件了,這個現(xiàn)在免費的郵箱像163,sina都支持,好了費話不說多了來看看一段phpmainer 163郵件發(fā)送郵件吧。
    2015-05-05
  • PHP編程實現(xiàn)的TCP服務(wù)端和客戶端功能示例

    PHP編程實現(xiàn)的TCP服務(wù)端和客戶端功能示例

    這篇文章主要介紹了PHP編程實現(xiàn)的TCP服務(wù)端和客戶端功能,結(jié)合實例形式分析了php基于socket實現(xiàn)TCP服務(wù)器端與客戶端通信功能的相關(guān)配置、定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • php中經(jīng)典方法實現(xiàn)判斷多維數(shù)組是否為空

    php中經(jīng)典方法實現(xiàn)判斷多維數(shù)組是否為空

    傳統(tǒng)的判斷數(shù)組為空 一般用count或者key 而且多維數(shù)組的話很麻煩
    2011-10-10
  • 了解Joomla 這款來自國外的php網(wǎng)站管理系統(tǒng)

    了解Joomla 這款來自國外的php網(wǎng)站管理系統(tǒng)

    joomla在國外很熱,就連臺灣都有不少站使用joomla,國內(nèi)就對joomla缺乏了解。大多都使用dedecms或者phpcms等。在這四個月來一直在學(xué)習(xí)joomla,覺得用它來建站很方便。
    2010-03-03
  • php源代碼安裝常見錯誤與解決辦法分享

    php源代碼安裝常見錯誤與解決辦法分享

    這篇文章主要介紹了在linux服務(wù)器中通過源代碼安裝php過程中,經(jīng)常會遇到的一些問題做個小結(jié),特分享給需要的朋友
    2013-05-05

最新評論