分类 代码分析 下的文章

PHP快速去掉数组中值为空的项

拿到一段字符串,做\n切割,得到数组,代码如下:

$a = '[2013-09-12 12:48:23]
[2013-09-12 12:48:23]
[2013-09-12 12:48:23]
[2013-09-12 12:48:24]
';


$datas = explode("\n", $a);

print_r($datas);

输出结果:

Array
(
[0] => [2013-09-12 12:48:23]
[1] => [2013-09-12 12:48:23]
[2] => [2013-09-12 12:48:23]
[3] => [2013-09-12 12:48:24]
[4] =>
)

如上,数组中的第5项的值为空,需要过滤掉空项。

第一个反应需要foreach循环遍历处理每一项,但是感觉这个效率太低。
百度一番,发现一个函数可以直接搞定——array_filter.

PHP手册中关于array_filter的说明:

array_filter — 用回调函数过滤数组中的单元

说明
array array_filter ( array $input [, callable $callback = "" ] )

依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。

参数
input
要循环的数组

callback
使用的回调函数
如果没有提供 callback函数, 将删除 input 中所有等值为 FALSE 的条目

代码如下:

$a = '[2013-09-12 12:48:23]
[2013-09-12 12:48:23]
[2013-09-12 12:48:23]
[2013-09-12 12:48:24]
';


$datas = explode("\n", $a);

print_r(array_filter($datas));

输出结果:

Array
(
[0] => [2013-09-12 12:48:23]
[1] => [2013-09-12 12:48:23]
[2] => [2013-09-12 12:48:23]
[3] => [2013-09-12 12:48:24]
)

Sublime Text下配置SublimeLinter进行PHP代码检查

以下内容只适用于sublime text 2.
sublime text 3的设置详见 Sublime Text3下配置SublimeLinter进行PHP代码检查

SublimeLinter 是前端编码利器——Sublime Text 的一款插件,用于高亮提示用户编写的代码中存在的不规范和错误的写法,支持 JavaScript、CSS、HTML、Java、PHP、Python、Ruby 等十多种开发语言。

SublimeLinter的主页地址

https://github.com/SublimeLinter/SublimeLinter

安装SublimeLinter

Ctrl + Shift + P 调用出Sublime Text的包管理工具,输入SublimeLinter,回车进行安装。

配置SublimeLinter

打开 SublimeLinter 的配置文件,Preferences->Package Settings->SublimeLinter->Settings - User,进行如下配置

  1. 运行模式:

    "sublimelinter": "save-only",

SublimeLinter 的运行模式,总共有四种,含义分别如下:
true - 在用户输入时在后台进行即时校验;
false - 只有在初始化的时候才进行校验;
"load-save" - 当文件加载和保存的时候进行校验;
"save-only" - 当文件被保存的时候进行校验;
推荐设置为 “save-only”,这样只在编写完代码,保存的时候才校验,Sublime Text 运行会更加流畅。

  1. 校验引擎

    "sublimelinter_executable_map":
     {
         "php": "C:\\xampp\\php\\php.exe"  // windows下要使用\\
     }
    

保存后你就能看到它在工作了。
[caption id="attachment_1052" align="aligncenter" width="300"]SublimeLinter工作 SublimeLinter工作[/caption]

svn st 出现叹号文件冲突的解决方法

! 状态表示 “该项目已遗失(被非 svn 命令删除)或不完整”。

经常在svn 合并的时候由于某种原因使用ctrl + c命令强制退出后,再执行svn st命令发现某些文件出现了!状态。

这个时候只需要重新执行svn up命令即可。

12月4日更新,今天又出现类似的错误 —— “!M”,如图:

svn冲突

形成原因:
先是svn add QRCode目录,然后我直接rm QRCode -r ,结果svn st就出现上面的问题了。

解决方法:
首先svn revert QRCode下的两个文件:

svn revert app/src/include/LIB/Package/QRCode/Client.php
svn revert app/src/include/LIB/Package/QRCode/QRCode.php

然后创建QRCode目录

mkdir app/src/include/LIB/Package/QRCode

然后还原QRCode目录

svn revert app/src/include/LIB/Package/QRCode

然后删除QRCode目录即可,此时svn st无错误了。

浮点数运算的灵异问题

本来准备看下程序执行的耗时,结果发现一个灵异问题,代码如下:


$x = microtime(true);

/*中间代码省略*/

$y = microtime(true);

echo ($y-$x) . "\n";

结果输出为:

2.8610229492188E-6

应该是会返回秒数的,怎么会变成上面这种呢?
翻了下PHP手册,里面提到这么一句。

如果给出了 get_as_float 参数并且其值等价于 TRUE, microtime 将返回一个浮点数。

百思不得其解,问了下朋友,后来发现是浮点数运算的问题。

再看一个例子,代码如下:

$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);

结果输出为:

bool(false)

再来一个例子,代码如下:

$a = 0.1+0.7;
$b = 0.8;
printf("%0.20f", $a);
echo '
'; printf("%0.20f", $b);

结果输出为:

0.79999999999999993339
0.80000000000000004441

显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

所以要比较两个浮点数,需要将其控制在我们需要的精度范围内再行比较,因此使用 bcadd() 函数来对浮点数想加并进行精度转换(为字符串):

var_dump(bcadd(0.1,0.7,1) == 0.8);

结果输出为:

bool(true)

linux下的cp强制覆盖

Linux下默认cp命令是有别名(alias cp='cp -i')的,无法强制覆盖,即使你用 -f 参数也无法强制覆盖文件.

[caption id="attachment_1035" align="alignnone" width="160"]linux别名 linux别名[/caption]

你可以这样执行cp强制覆盖的命令.

\cp a /test/a