foreach ($array_1 as $k => $v1) { $flag = false; foreach ($array_2 as $v2) { if ($flag = ($v1 == $v2)) " /> 99精品在线,国产精品一区二区三区久久 ,精品视频免费观看

中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

深思 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;
}雖然實現是可以的,但是發現這個函數的效率是慘不忍睹。于是我又重新考慮了下,并優化了算法,第二個函數看起來是這個樣子的:

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 組織存放,本身沒有索引,每次查找都是遍歷??偨Y
這雖然是 php 語言的一個小竅門,但在遍歷和對比數組的值上,如果需要對比值將其與鍵反轉的確比通常的值對值的比較效率要高得多。

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

附代碼
復制代碼 代碼如下:
<?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 "函數 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";
?>


php技術深思 PHP 數組遍歷的差異(array_diff 的實現),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 丝袜一区二区三区 | 久久精品免费 | 中文字幕久久久 | 日本a∨精品中文字幕在线 亚洲91视频 | 成人精品一区亚洲午夜久久久 | 欧美亚洲第一区 | 天天看天天爽 | 羞羞在线观看视频 | 欧美极品在线视频 | 中文字幕亚洲欧美日韩在线不卡 | 岛国av免费在线观看 | 玩丰满女领导对白露脸hd | 国产wwwcom| 亚洲国产精品福利 | 久久九精品 | 亚洲三区在线观看 | 亚洲精品一区二区三区四区高清 | 午夜爽爽男女免费观看hd | 国产色网站 | 精品在线一区二区三区 | 久久69精品久久久久久国产越南 | 黑人巨大精品欧美一区二区免费 | 国产精品欧美一区二区 | 亚洲欧美日韩久久久 | 黄色成人免费在线观看 | 国产精品视频导航 | 在线看亚洲 | 日本三级网站在线观看 | 日韩精品一区二区不卡 | 久久久久久免费毛片精品 | 91一区二区 | 国产成人精品一区二 | 免费一区二区三区 | 国产成人精品一区二区三区网站观看 | 偷拍自拍网址 | 九九99九九精彩46 | 超碰在线免费公开 | 国产精品久久久久婷婷二区次 | 亚洲欧美视频 | 国产精品国产三级国产aⅴ中文 | 黄片毛片免费看 |