無標題文檔

Smarty Cheat Sheet

本人很喜欢偷懒,所以很喜欢 Cheat Sheet 快速查找一些东西。现在,网络上找到份 Smarty 的 Cheat Sheet。 Smarty 一直我都认为是一个好东西,所以这份 Cheat Cheet 对于我来说会很重要。

另外还有 jQuery 和 Prototype 的 Cheat Sheet 以及 MySQL 的 Cheat Sheet 提供下载(实在是居家旅行,开发糊口的必备利器)。

废话不多说,在这里提供 ZIP 格式打包下载 。此文档为 PDF 格式,出处在 这里

另外,还有一位 更牛的家伙收集了大量的 Cheat Sheet ,看来还有比我更懒的。

转换字符串至 NCR

看见 PHPChina 上转帖 andot 的一篇文章《 在任意字符集下正常显示网页的方法 》,非常的受用,于是将代码粘贴到这里收藏一下。

同个页面呈现不同语言字符的编码使用 UTF-8 是目前主流的应用方案。但是在一些极端的情况下,我们不得不在某些西方字符编码的页面上显示中文。

这时候,作者非常「取巧」地想到了使用 Numeric character reference 解决这一问题。原理引述原文:

原理很简单,就是把除了 ISO-8859-1 编码中前 128 个字符以外的所
有其他的编码都用 NCR(Numeric character reference) 来表示。比如
「汉字」这两个字,如果我们写成「汉字」这种形式,
那么它在任意字符集下都可以正确显示。

下面是我做的一些无关痛痒的修改,希望作者见谅:

/**
 * nochaoscode - 转换字符串至 NCR
 *
 * @param  string $str     原字符串
 * @param  string $encode  原字符串的编码,默认 UTF-8
 * @return string 原字符串的 NCR 字符
 * @see http://en.wikipedia.org/wiki/Numeric_character_reference
 */
function nochaoscode($str, $encode = "utf-8")
{
    if (!function_exists("iconv") || !function_exists("mb_strlen")) {
        return $str;
    }

    $str = iconv($encode, "utf-16", $str); 
    for ($i = 0; $i < mb_strlen($str); $i+=2) { 
        $code = ord($str{$i}) * 256 + ord($str{$i + 1}); 
        if ($code < 128) {
            $output .= chr($code); 
        } else if ($code != 65279) {
            $output .= "&#" . $code . ";"; 
        }
    }

    return $output; 
}

原作者的 DEMO 在这里 ,但是不知道什么原因我打不开,请各位了解的告之。

深思 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 bWluZ2NoZW5nQGdyYWNlY29kZS5jb20K | base64 -d`

文章

项目