• 技术文章 >后端开发 >php教程

    colesafearray 深思 PHP 数组遍历的差异(array_diff 的实现)

    2016-07-29 08:37:29原创677
    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 组织存放,本身没有索引,每次查找都是遍历。总结
    这虽然是 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 < 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";
    ?>


    以上就介绍了colesafearray 深思 PHP 数组遍历的差异(array_diff 的实现),包括了colesafearray方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:colesafearray
    上一篇:phpmyadmin 下载 用phpmyadmin更改mysql50登录密码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 手写PHP API框架(二)之Composer的安装使用• 设计API接口时,要注意这些地方!• PHP8.3要有新函数了!(json_validate函数说明)• 聊聊PHP escapeshellarg函数使用的中文问题• PHP原生类的总结分享
    1/1

    PHP中文网