無標題文檔

深思 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 数组方面的讨论感兴趣,可以 点击这里

Ninja - 微型 PHP 远程文件管理工具

https://friable.rocks/_/2007_12_13/1197531016.png

这个是我业余时间做的一个 PHP 文件管理脚本,安装的方法很简单,解压缩以后直接运行即可。默认的登录用户名和密码是 'admin',如果你需要修改,则改代码的前两个语句就可以了(很容易就能看懂)。

目前所实现的功能:

  1. 用户认证登录
  2. 类似于 ls 命令的文件列表
  3. 可以下载所有服务器端可读的文件
  4. 如目标目录可写,则可以上传文件到目标目录
  5. 如目标文件可写,则可以重命名、删除文件

这个脚本还有很多的问题,不过基本功能已经可以使用。文件中的代码不是加密以后的代码,是本人为了能将脚本的体积减少而采用 base64_encode 以后再 gzcompress 一下而得(所以需要源代码的可以执行其逆操作)。

按照传统,这里是 ZIP 格式打包下载 。我会继续完善该脚本的功能,感谢 Kingla pei爵溪 、Genghonghao、 庞哥 等兄弟的意见和建议。

声明:本人提供该工具仅仅是出于学术研究,如使用该脚本发生的一切后果,本人不负任何的责任。如有任何的技术问题,欢迎留言交流。

支持中文的动态文字替换(Dynamic Text Replacement)

前几天看见 iVane 的 Blog 有篇文章 是介绍如何动态文字替换的。但是结尾很遗憾的说这个功能强大的软件不支持中文。

我当时就答应下来帮他 Hack 一下。过了几天我差不多把这个事情给忘记了,直到他今天下午「催」了我一下,我才记得有这回事情。iVane 兄弟不好意思啦。

对了,让大家久等了。这就是支持中文的动态文字替换(Dynamic Text Replacement)。需要有几点要说明:

  1. 页面(HTML)的编码要是 utf-8 的(我使用这个编码测试的,其他的编码没有测试过)
  2. 字体文件尽量使用英文文件名,以免造成不必要的麻烦
  3. 第一次运行由于需要生成图片,所以效果在第二次运行的出现
  4. 调用的时候使用文件名(UNIX 主机请注意大小写),比如文件名为 jianyy.ttf 则在 css 中设置名称为 jianyy (参看 DEMO 的 CSS 文件)。
  5. 由于使用缓存机制,请务必将 dtr/cache 目录设置为可写
  6. 经过测试,虽然此程序使用了缓存机制,但是占用的服务器运行资源还是比较多的,请谨慎使用
  7. 最后就是注意下字体的版权问题,DEMO 中的字体为「简 YY 体」版权未知

最后 DEMO 在这里 ,打包的文件可以在 这里下载 ,相关的教程可以参看 iVane 兄弟的 相关文档

如有任何问题,欢迎留言。

我的照片

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

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

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

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

分类

搜索

文章