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

时间:2024-07-06 13:01:37 

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 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。

附代码


<?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,数组遍历,array,diff
0
投稿

猜你喜欢

  • Ubuntu Server下MySql数据库备份脚本代码

    2024-01-16 09:31:39
  • numpy中的delete删除数组整行和整列的实例

    2022-11-24 22:09:01
  • Python中一些深不见底的“坑”

    2021-10-10 05:03:57
  • Python PyQt5学习之自定义信号

    2022-01-06 12:03:52
  • python实现从pdf文件中提取文本,并自动翻译的方法

    2021-06-08 18:55:56
  • 从 msxml6.dll 中获取 DOMDocument 对象的方法与属性

    2009-02-22 18:46:00
  • Pycharm自动添加文件头注释和函数注释参数的方法

    2023-06-05 04:01:51
  • golang中json和struct的使用说明

    2023-10-09 13:09:10
  • 利用Python实现原创工具的Logo与Help

    2021-06-03 20:43:05
  • asp智能脏话过滤系统v1.0

    2011-04-14 11:00:00
  • 对pandas将dataframe中某列按照条件赋值的实例讲解

    2023-03-12 07:24:58
  • Vue使用Echarts画柱状图详解

    2024-05-29 22:22:29
  • Bootstrap DateTime Picker日历控件简单应用

    2024-05-11 09:34:14
  • PHP session反序列化漏洞深入探究

    2023-05-30 04:53:04
  • python如何使用jt400.jar包代码实例

    2021-05-07 03:50:46
  • Python创建SQL数据库流程逐步讲解

    2024-01-23 14:29:17
  • 基于numpy实现逻辑回归

    2023-06-21 10:04:25
  • Django之PopUp的具体实现方法

    2023-03-26 13:04:54
  • Python遍历文件夹 处理json文件的方法

    2022-02-19 16:08:40
  • php获取文章内容第一张图片的方法示例

    2023-11-09 18:55:14
  • asp之家 网络编程 m.aspxhome.com