php數組遍歷的差別(array_diff)實現

初次接到這個題目,我發現這很是的簡單,因而按照以往的經驗「隨便」寫了一個:

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;
}php

雖然實現是能夠的,可是發現這個函數的效率是慘不忍睹。因而我又從新考慮了下,並優化了算法,第二個函數看起來是這個樣子的:
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 函數的速度媲美了。可是還有沒有更優化的辦法呢?由 ChinaUnix 上的一篇文章(很差意思,做弊了),我發現 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;
}
數組

這個函數的效率很是的驚人,甚至比原 array_diff 函數的速度都要快。究其緣由,我找到了解釋:

由於鍵是進行 HASH 組織的,查找很快;
而 Value 只是由 Key 組織存放,自己沒有索引,每次查找都是遍歷。

總結

這雖然是 PHP 語言的一個小竅門,但在遍歷和對比數組的值上,若是須要對比值將其與鍵反轉的確比一般的值對值的比較效率要高得多。

好比,上面的函數二須要調用 in_array 函數須要循環判斷是否在函數內;而函數三則僅僅判斷這個數組是否存在該鍵就能夠了。

加上數組鍵和值不一樣的組織索引方式,效率比想象的還高那就很是能夠理解了。
函數

相關文章
相關標籤/搜索