PHP的匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数, C++的新标准C++0x也开始支持了。

匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数, 最常见应用是作为回调函数。

继续阅读

Git 中忽略某些文件或者文件夹

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示“Untracked files …”,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

举个例子:

假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件,因此你需要忽略Windows自动生成的垃圾文件:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

然后,继续忽略Python编译产生的.pyc.pyodist等文件或目录:

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

加上你自己定义的文件,最终得到一个完整的.gitignore文件,内容如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说“working directory clean”。

使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。

小结

  1. 忽略某些文件时,需要编写.gitignore
  2. .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
  3. 从版本库中删除
    $ git rm test.txt
    rm 'test.txt'
    $ git commit -m "remove test.txt"

忽略文件夹写法

如何使用Google Fonts的360镜像给WordPress网站提速

最近,有网友反映称谷歌官网域名google.com、谷歌香港google.com.hk都打不开, ping了一下google.com和google.com.hk两个域名的服务器情况,最后ping出来的IP地址均显示为“美国”,也就是说谷歌香港(google.com.hk)的服务器,已由香港转移至美国,所以链接时间会很长,甚至断断续续出现请求超时的情况.

Google服务在大陆的崩溃情况不仅影响到了广大网民,也影响到了数百万的站长。WordPress是世界上最大的开源博客程序,而WordPress大部分的主题都在使用Google的在线字体方案——Google Fonts,Google服务一不稳定,大量的独立博客字体就加载不出来,直接导致了几十万独立博客打开速度令人无法忍受,严重的时候会导致网站打不开。

\

图:Google字体打开时间19秒

   为此,360网站卫士推出一项字体加速服务,站长只要修改一行代码,就可以免费使用到由360网站卫士CDN加速的字体服务。

 修改方法如下:

打开wordpress代码中的文件wp-includes/script-loader.php文件,搜索:fonts.googleapis.com找到这行代码:

$open_sans_font_url = “//fonts.googleapis.com/css?family1=Open+Sans:300italic,400italic,600italic,300,400,600⊂=$subsets”;

\

把fonts.googleapis.com替换为fonts.useso.com

\

   修改完保存,再次刷新,大家就可以发现,自己的网站速度已经比以前快了很多,几乎瞬间就可以拿到Google字体了。原因就是本来需要从美国服务器才能拿到的google字体,现在已经遍布360全国的机房了。

\

欢迎大家试用我们的新福利。

   如果各位站长想要更威猛的加速效果,使用专业的加速解决方案,只需要登陆360网站卫士官网(wangzhan.360.cn),申请加入即可。

Go语言的复合数据类型struct,array,slice,map

1、结构体 struct

定义格式:

type 结构体名称 struct {
    属性1    类型
    属性2    类型
    ...
}

结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一个指针,使用var,则是结构体自身。

type User struct {
    name    string
    age     int
}

user := new(User)
user.name = "tom"
user.age = 20

fmt.Println(user) //输出&{tom 20}

上例中使用new来初始化一个结构体,user的类型就是*User,在输出内容中的&字符号也表现了这点。接下来看下使用var的情况:

type User struct {
    name    string
    age     int
}

var user User
user.name = "tom"
user.age = 20

fmt.Println(user) //输出{tom 20}

这里输出中没有&符号了。

如果结构体属性比较多,每个属性初始化都要一行,代码就显的比较冗长,Go语言提供更简洁的写法:

type User struct {
    name    string
    age     int
}

user := User{"tom", 20} //按顺序给属性赋值
//user := User{age: 20, name: "tom"} //指明属性赋值
fmt.Println(user)

要注意的就是如果不指明属性,就是按照结构体内属性的先后顺序进行赋值。

2、数组 array

数组使用很广泛,很多语言都有会有数组的实现。

定义格式:

[长度]类型{初始化值}

其中长度可以省略或者换成三个点“…”,如果这么做的话,系统会根据初始化的值自动定义数组的长度。

简单的示例:

arr := [2]int{3, 2}
//arr := []int{3, 2} 
//arr := [...]int{3, 2}
fmt.Println(arr)  //输出[3 2]

如果指明了长度,但是没有初始值,则会根据数组类型初始化每个值

arr := [5]int{}
fmt.Println(arr) //输出[0 0 0 0 0]

3、切片 slice

切片可以和数组很好的配合使用,可以用来获取数组中一段数据。格式:

数组变量[开始索引:结束索引]

其中不包括结束索引。

arr := [5]int{3,4,5,6,7}
slice := arr[0:3]
fmt.Println(slice) //输出[3 4 5]

切片也可以用于字符串:

str := "Anny is a beautiful girl."
fmt.Print(str[0:6]) //输出Anny i

4、字典 map

在Go语言数组中,字符串是不能做键值的,我觉着字典很好的弥补了这个不足。

字典定义格式:

map[键类型] 值类型 {
    键: 值,
    ....
}

一个简单示例:

ages := map[string] int {
    "tom": 21,
    "anny": 18,
}

fmt.Println(ages["tom"])

使用字典时,还能动态添加字典元素,也很方便。

ages := map[string] int {
    "tom": 21,
    "anny": 18,
}

ages["jack"] = 20

fmt.Println(len(ages))

如果键在字典里是不存在的,则返回一个默认值,默认值根据不同的类型决定。

ages := map[string] int {
    "tom": 21,
    "anny": 18,
}

fmt.Println(ages["jack"]) //输出0

JavaScript中的对象

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数…

此外,JavaScript 允许自定义对象。

JavaScript 对象

JavaScript 提供多个内建对象,比如 String、Date、Array 等等。

对象只是带有属性和方法的特殊数据类型。

访问对象的属性

属性是与对象相关的值。

访问对象属性的语法是:

objectName.propertyName

这个例子使用了 String 对象的 length 属性来获得字符串的长度:

var message="Hello World!";
var x=message.length;

在以上代码执行后,x 的值将是:

12

访问对象的方法

方法是能够在对象上执行的动作。

您可以通过以下语法来调用方法:

objectName.methodName()

这个例子使用了 String 对象的 toUpperCase() 方法来将文本转换为大写:

var message="Hello world!";
var x=message.toUpperCase();

在以上代码执行后,x 的值将是:

HELLO WORLD!

创建 JavaScript 对象

通过 JavaScript,您能够定义并创建自己的对象。

创建新对象有两种不同的方法:

  1. 定义并创建对象的实例
  2. 使用函数来定义对象,然后创建新的对象实例

创建直接的实例

这个例子创建了对象的一个新实例,并向其添加了四个属性:

实例

person=new Object();
person.firstname="Bill";
person.lastname="Gates";
person.age=56;
person.eyecolor="blue";

替代语法(使用对象 literals):

实例

person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"};

使用对象构造器

本例使用函数来构造对象:

实例

function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
}

创建 JavaScript 对象实例

一旦您有了对象构造器,就可以创建新的对象实例,就像这样:

var myFather=new person("Bill","Gates",56,"blue");
var myMother=new person("Steve","Jobs",48,"green");

把属性添加到 JavaScript 对象

您可以通过为对象赋值,向已有对象添加新属性:

假设 personObj 已存在 – 您可以为其添加这些新属性:firstname、lastname、age 以及 eyecolor:

person.firstname="Bill";
person.lastname="Gates";
person.age=56;
person.eyecolor="blue";

x=person.firstname;

在以上代码执行后,x 的值将是:

Bill

把方法添加到 JavaScript 对象

方法只不过是附加在对象上的函数。

在构造器函数内部定义对象的方法:

function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;

this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}

changeName() 函数 name 的值赋给 person 的 lastname 属性。

现在您可以试一下:

myMother.changeName("Ballmer");

JavaScript 类

JavaScript 是面向对象的语言,但 JavaScript 不使用类。

在 JavaScript 中,不会创建类,也不会通过类来创建对象(就像在其他面向对象的语言中那样)。

JavaScript 基于 prototype,而不是基于类的。

JavaScript for…in 循环

JavaScript for…in 语句循环遍历对象的属性。

语法

for (对象中的变量)
  {
  要执行的代码
  }

注释:for…in 循环中的代码块将针对每个属性执行一次。

实例

循环遍历对象的属性:

var person={fname:"Bill",lname:"Gates",age:56};

for (x in person)
  {
  txt=txt + person[x];
  }

from:w3school

去除php数组中,重复的值

一维数组的重复项

      使用array_unique函数即可,使用实例如下:

              <?php
                  $aa=array(“chengxusheji”,”banana”,”pear”,”chengxusheji”,”wail”,”watermalon”);
                  $bb=array_unique($aa);
                  print_r($bb);
               ?>

      结果如下:Array ( [0] => chengxusheji [1] => banana [2] => pear [4] => wail [5] => watermalon ) 。

二维数组的重复项

     对于二维数组咱们分两种情况讨论,一种是因为某一键名的值不能重复,删除重复项;另一种因为内部的一维数组不能完全相同,而删除重复项,下面举例说明:

           ㈠因为某一键名的值不能重复,删除重复项

          <?php
           function assoc_unique($arr, $key)
            {
              $tmp_arr = array();
              foreach($arr as $k => $v)
             {
                if(in_array($v[$key], $tmp_arr))//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
               {
                  unset($arr[$k]);
               }
             else {
                 $tmp_arr[] = $v[$key];
               }
             }
           sort($arr); //sort函数对数组进行排序
           return $arr;
           }

           $aa = array(
           array(‘id’ => 123, ‘name’ => ‘张三’),
           array(‘id’ => 123, ‘name’ => ‘李四’),
           array(‘id’ => 124, ‘name’ => ‘王五’),
           array(‘id’ => 125, ‘name’ => ‘赵六’),
           array(‘id’ => 126, ‘name’ => ‘赵六’)
           );
           $key = ‘id’;
           assoc_unique(&$aa, $key);
           print_r($aa);
           ?>

     显示结果为:Array ( [0] => Array ( [id] => 123 [name] => 张三 ) [1] => Array ( [id] => 124 [name] => 王五 ) [2] => Array ( [id] => 125 [name] => 赵六 ) [3] => Array ( [id] => 126 [name] => 赵六 ) )

       ㈡因内部的一维数组不能完全相同,而删除重复项

           <?php
           function array_unique_fb($array2D){
                foreach ($array2D as $v){
                    $v = join(“,”,$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
                    $temp[] = $v;
                }
                $temp = array_unique($temp);    //去掉重复的字符串,也就是重复的一维数组
               foreach ($temp as $k => $v){
                   $temp[$k] = explode(“,”,$v);   //再将拆开的数组重新组装
               }
               return $temp;
           }

           $aa = array(
           array(‘id’ => 123, ‘name’ => ‘张三’),
           array(‘id’ => 123, ‘name’ => ‘李四’),
           array(‘id’ => 124, ‘name’ => ‘王五’),
           array(‘id’ => 123, ‘name’ => ‘李四’),
           array(‘id’ => 126, ‘name’ => ‘赵六’)
           );
           $bb=array_unique_fb($aa);
           print_r($bb)
           ?>

         显示结果:Array ( [0] => Array ( [0] => 123 [1] => 张三 ) [1] => Array ( [0] => 123 [1] => 李四 ) [2] => Array ( [0] => 124 [1] => 王五 ) [4] => Array ( [0] => 126 [1] => 赵六 ) ) 

根据用户操作系统语言来切换网页语言(兼容各大主流浏览器)

原理:用javascript识别操作系统语言来切换网页语言。

兼容浏览器:IE、火狐、chrome、safari等主流浏览器

相关代码:

<script   language=javascript>   
  var sysLan = (navigator.language || navigator.browserLanguage).toLowerCase();
  if(sysLan != 'zh-cn') {
  	alert('en');
  	window.location.href="http://www.chengxusheji.com/en/index.html";
  } else {
  	alert('cn');
  	window.location.href="http://www.chengxusheji.com/cn/index.html";
  }
</script>

参考文档:navigator对象几个语言相关属性简介

根据ip库判断用户ip例子:http://www.yemiansheji.com/ip/

navigator 对象中几个与语言相关的属性简介

问题描述

各浏览器对 navigator 对象中几个与语言相关的属性(language、userLanguage、browserLanguage、 systemLanguage)的返回值存在很大的差异。

造成的影响

由于不同浏览器对这几个属性的返回值有很大差异,同时返回的有效值的大小写也有差异。若在获取当前浏览器语言的时候没有考虑到这些差异则可能造成兼容性问题。

问题分析

首先查看一下 navigator 对象中的这几个与 language 相关的属性。

navigator 对象包含有关浏览器的信息。没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象。但是其内部一些属性及其返回值在各浏览器并不统一。

  • language:返回当前的浏览器语言(来自 Mozilla Developer Center)
  • userLanguage:返回操作系统设定的自然语言(来自 MSDN)
  • browserLanguage:返回当前的浏览器语言(来自 MSDN)
  • systemLanguage:返回当前操作系统的缺省语言(来自 MSDN)

关于 navigator 对象的更多资料,请参见:MSDNMozilla Developer Center

对于浏览器,Mozilla Developer Center 中的 language 属性与 MSDN 中的 browserLanguage 属性描述很像。

分析以下代码:

<script>
document.write('navigator.language:'+navigator.language);
document.write('<br>navigator.userLanguage:'+navigator.userLanguage);
document.write('<br>navigator.browserLanguage:'+navigator.browserLanguage);
document.write('<br>navigator.systemLanguage:'+navigator.systemLanguage);
</script>

代码中打印出了各浏览器对于这 4 个属性返回值的情况:

IE6 IE7 IE8 Firefox Chrome Safari Opera
navigator.language undefined zh-CN zh-CN
navigator.userLanguage zh-cn undefined zh-cn
navigator.browserLanguage zh-cn undefined zh-cn
navigator.systemLanguage zh-cn undefined undefined

解决方案

可以使用下面的代码获取当前浏览器语言:

(navigator.language || navigator.browserLanguage).toLowerCase()

来自:转载

PHP计算任意两个日期之间的天数

PHP面试题中,关于日期的题目作为基础考题经常出现,下面讨论一下获取两个日期之间的天数的方法。

收到一个答案,拆分年、月、日,分别进行减法,然后统计天数,好累。

针对低版本的PHP可以用下面的方式搞定:

 

$date1 = '2014-02-18 00:09:13';
	$date2 = '2014-03-19 00:02:18';

	function differDays($date1, $date2) {

		$differNums = strtotime($date2) - strtotime($date1);

		$differNums = $differNums / (3600 * 24);

		echo floor(abs($differNums));

	}

	echo differDays($date1, $date2);

	echo "\n";
//或者
	function difDays($date1,$date2){ 

		$date1 = substr($date1, 0, 10);
		$date2 = substr($date2, 0, 10);

		$time1 = explode("-", $date1); 
		$time2 = explode("-", $date2); 

		$date1 = mktime(0, 0, 0, $time1[1],$time1[2],$time1[0]); 
		$date2 = mktime(0, 0, 0, $time2[1],$time2[2],$time2[0]);

		return ($date2 - $date1)/(3600*24) - 1; 
	}

	echo difDays($date1, $date2);

PHP5.3以上版本可以使用date_diff:

 

function dateDiff($date1, $date2) {
		$datetime1 = new DateTime($date1);
		$datetime2 = new DateTime($date2);
		$interval = $datetime1->diff($datetime2);
		return $interval->format('%a');
	}

	echo dateDiff($date1, $date2);

 

本文例子下载:http://pan.baidu.com/s/1eQ1Nn14