無標題文檔

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

还是 部门无聊的考题,不过这次考的是 PHP 的能力。题目如下:

给你两个分别有 5000 个元素的数组,计算他们的差集
  -- 说白了也就是用 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 组织存放,本身没有索引,每次查找都是遍历。

总结

这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,如果需要对比值将其与键反转的确比通常的值对值的比较效率要高得多。

比如,上面的函数二需要调用 in_array 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。

附,测试连接在 这里打包下载 )。如对 Javascript 数组方面的讨论感兴趣,可以 点击这里

jQuery 和 Prototype 的 Cheat Sheet

本人一直在「偷懒」 使用 jQuery 框架。同时我也认识到 Prototype 这个 Javascript 框架似乎也不错(不过已经能使用 jQuery 解决问题了,那么就别无所求了)。

无意间看到篇 文章 ,是讲述 Prototype 和 jQuery 两个「阵营」的,作者说的非常的有道理,引用一下:

造成代码风格的这种差异,其实是两个 framework 的开发者不同的代码哲学造成的。
对于 prototype 来说,非常类似 Java 的处理方式:将一系列的功能封装到一个类
之中,比如 Math 类。而对于 jQuery 来说,其哲学理念是将所有的 HTML 节点都
视为一个 Object , 通过调用这个 Object 上面不同的方法向这个 Object 发送不
同的消息,来让 Object 自己实现不同的功能,产生不同的表现。

我个人而言,不管怎么样,这两个 Javascript 框架都是非常优秀的。有兴趣的朋友可以选择自己喜欢的学习之。但我发现原文的两张大图链接由于 某些原因 不能下载,于是我将其做了一个「镜像」方便大家使用。

https://friable.rocks/_/2007_12_20/1745166417.jpg

https://friable.rocks/_/2007_12_20/1366687851.jpg

还是按照传统,在这里可以 ZIP 打包下载 ,或者访问我的 Yupoo 相册 获得。

另,免费出售 MySQL Cheat Sheet 中文版 一张,欲抢从速。

Vim 对 GFW 的解释

想不到 Vim 的开发者那么有先见之明,对我们伟×大×祖×国的 Great Firewall 已经做出了那么「透彻的」解释。截图如下:

https://friable.rocks/_/2007_12_19/1579663249.jpg

想要查看 Vim 对于 GFW 的解释,可以在命令模式下输入

:help gfw 

即可。

原来 GFW 是 guifontwide 的缩写,这个参数的主要作用就是指定宽字符的字体和大小。中文翻译请参看 这个链接 ,并搜索 「gfw」 或者「guifontwide」。

'guifontwide' 'gfw'     字符串       (缺省为 "")
                        全局
                        {Vi 无此功能}
                        {only 仅当编译时加入 GUI 的支持才有效}

        如果非空,指定用于双宽字符的逗号分隔的字体列表。第一个能载入的字体被使
        用。

        注意: 这些字体必须使用 'guifont' 指定的两倍宽度和相同的高度。

        除了 GTK+ 2 之外的所有 GUI 版本:

        'guifontwide' 只有在 'encoding' 设为 "utf-8" 并且 'guifontset' 为空或
        非法的时候才使用。
        如果设置 'guifont' 并且从中找到合法的字体,但 'guifontwide' 为空的时
        候,Vim 会试图找到匹配的双宽的字体并设置 'guifontwide' 为此值。

这下证据已经非常清楚了。Vim 这个「邪恶的软件」及其作者,不仅剥夺了本人的青春,让我「死命」在其上面编写代码;还扭曲了我们伟×大×祖×国建立的金×盾×工×程。此欲颠覆造福我们子孙后代「安×全工程」、我们伟×大和×谐的社×会的诡计已经昭然若揭。

请各位愤青们首先了解 什么是 Vim 编辑器 ,然后上其 官方网站 声讨之。

最后,还不知道 GFW 的同学请速补习一下什么是 防×火×长×城保证需要代理才能访问,这里是 备用链接 )。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章