如何得到两个日期中间所有日期的Array

如果我有两个日期的String,’2015-01-01′ 和 ‘2016-03-15’, 如何使用PHP将它们之间的所有日期用Array封装呢?PHP有一个DateInterval的Class就是做这个的。下面是我根据PHP官方文档写的function。

function get_date_array($start_date, $end_date){
    $date_array = array();
    $start_date = new DateTime($start_date);
    $end_date = new DateTime($end_date);
    //$end_date = $end_date->modify(' +1 day ');//如果要包括end_date的话
    $interval = new DateInterval('P1D'); 
    $daterange = new DatePeriod($start_date, $interval ,$end_date);
    foreach($daterange as $date){
         array_push($date_array, $date->format("Y-m-d"));
    }
    return $date_array;
}

PHP:如何过滤一个Array

$new_array = array('2015-01-01', '2015-12-01', '2016-01-01','2016-05-05','2016-07-01');

给出上面这样一个array,如何过滤它,得出2015-06-01之后的值呢?可以用array_filter 这个function。下面是使用的例子

$filtered_array = array_filter($new_array, 'my_filter_function');
function my_filter_function($var){
    return strtotime($var)>=strtotime('2015-06-01');
}

PHP:json_encode返回的可不一定是json object

用PHP做移动端数据接口,以json_encode返回json object数据,今天安卓端的同事跟我反映收到一个空的Array,导致客户端崩溃。空的Array在json_encode的时候难道不会被转为json object么?

查了一下还真是这样。如果不加任何选项,空的Array默认返回的还是空Array,想要全部转为json object,必须加JSON_FORCE_OBJECT选项作为第二参数。

下面是php官网摘录的具体选项的用法

<?php
$a = array('<foo>',"'bar'",'"baz"','&blong&', "xc3xa9");

echo "Normal: ",  json_encode($a), "n";
echo "Tags: ",    json_encode($a, JSON_HEX_TAG), "n";
echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "n";
echo "Quot: ",    json_encode($a, JSON_HEX_QUOT), "n";
echo "Amp: ",     json_encode($a, JSON_HEX_AMP), "n";
echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "n";
echo "All: ",     json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "nn";

$b = array();

echo "Empty array output as array: ", json_encode($b), "n";
echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "nn";

$c = array(array(1,2,3));

echo "Non-associative array output as array: ", json_encode($c), "n";
echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "nn";

$d = array('foo' => 'bar', 'baz' => 'long');

echo "Associative array always output as object: ", json_encode($d), "n";
echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "nn";
?>

下面是对应的output


Normal: ["","'bar'",""baz"","&blong&","u00e9"]
Tags: ["u003Cfoou003E","'bar'",""baz"","&blong&","u00e9"]
Apos: ["","u0027baru0027",""baz"","&blong&","u00e9"]
Quot: ["","'bar'","u0022bazu0022","&blong&","u00e9"]
Amp: ["","'bar'",""baz"","u0026blongu0026","u00e9"]
Unicode: ["","'bar'",""baz"","&blong&","é"]
All: ["u003Cfoou003E","u0027baru0027","u0022bazu0022","u0026blongu0026","é"]

Empty array output as array: []
Empty array output as object: {}

Non-associative array output as array: [[1,2,3]]
Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}}

Associative array always output as object: {"foo":"bar","baz":"long"}
Associative array always output as object: {"foo":"bar","baz":"long"}

我觉得这个是一个很好的PHP面试题。

为什么我的Google Map Marker在安卓手机上无法点击?

这两天搞了一个查询大温地区公交信息的网页应用,用了Google Map的JavaScript API来显示用户附近1.5公里以内的公交车站,用户点击车站图标后会有infoWindow弹出来显示公交站详情。

说来有点讽刺,在电脑上、各种iPhone以及Windows Phone上测试都没问题,唯独在Google自家的安卓系统访问网页时,地图上的公交图标是无法点击的。网上搜了一下,最近一篇类似的求助文章发表在4年前。情况不同的是,当时有开发者反映,只有iOS设备在使用Google地图才会有无法点击的问题。我照着大家提供的方法把Marker设置成draggable后问题解决,但我还是不能忍受允许用户随意拖拽图标。

抓耳挠腮想寻求更好的解决办法时,无意中看到了自己网页中的js请求url是下面这种,

https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap

网上有的示例代码会在url中加”v=3.**”,而有的用了”v=2.**”,会不会是版本问题?

于是研究了下Google官方文档在不提供版本变量时,他们会默认提供最新非正式版本(目前是3.exp)。有问题的就是这个版本,我定义了v=3.23后问题解决。不用设置draggable也可以了。

如何自定义 custom post type 的permalink

在WordPress添加custom post type之后,默认的permanlink组织形式是

http://example.com/post-type/post-name

如果想改为

http://example.com/post-type/%post_id%

应该如何做?根据网上搜到的教程,下面这段代码(以post_type=”business”为例)帮我实现了想要的功能。把它放入主题文件夹的functions.php或者专门新建一个插件都可以。插件激活之后要去访问一下后台permalink的设置页,不然新的permalink链接会有“页面无法显示”的错误。

add_filter('post_type_link', 'ct_post_type_link', 1, 3);

function ct_post_type_link( $post_link, $post = 0 ){
    $post_type = $post->post_type;

    if ( $post_type == 'business' ) {
        return home_url( "/$post_type/" . $post->ID);
    }else {
        return $post_link;
    }
}

add_action( 'init', 'ct_rewrites_init' );
function ct_rewrites_init(){
    add_rewrite_rule(
        'business/([0-9]+)?$',
        'index.php?post_type=business&p=$matches[1]',
        'top' );
}

wp_signon之后$current_user仍然为空的解决办法

最近在和国内的团队开发温哥华知道的安卓版本,有个问题困扰了我挺久。今天查出了原因,也学了一点小东西。

由于这是一款新闻资讯应用,开发后端时就借用了WordPress的框架。一来方便小编写文章,二来WordPress出色的模块如标签系统、用户系统、评论系统等,节省不少开发时间。

国内的团队反映用户登录后进行操作时,总是遇到用户未登录或登录过时的错误。使用同样的数据发送请求,我们这边却没有任何问题。

登录使用wp_signon(),var_dump($current_user)时就是已登录用户的详情。国内团队反应$current_user是空。我在使用wp_set_current_user()将登录用户设为$current_user后,问题就解决了。

才怪!哪有那么容易…今天温哥华这边快下班了,国内刚起床的弟兄们试了一下,登录是成功了,但用户进行登录后的操作时依然提示登录过期。

在公司使用Mac机,由于使用Postman未能重现问题,我回家用自己的PC下载了他们使用的Fiddler,终于知道问题所在:应该是cookie的问题。用户登录后,服务器会返回一个wordpress_logged_in_******的cookie,我在手动添加cookie发送新的请求时,问题迎刃而解。和国内团队沟通,才知道他们在客户端并没有保存cookie。

客户端保存cookie信息,每次用户进行登录后相关的操作时,后端可以通过WordPress function wp_set_auth_cookie() 来延长cookie有效期,这样用户也不用一再重复登录了。

同时为iOS和安卓提供后端服务支持,这也让我学了不少东西。iOS下运行正常的接口到安卓时,还得进行部分调整。以后再做类似的事情时也就少走一些弯路了。

 

越长大越孤单,越长大越不安

心中烦闷不已,忽然就想起了这句歌词。半夜睡不着,爬起来写点东西。

我人生的第三个十年在温哥华度过,也结识了不少新朋友,但要让我找一个掏心窝讲烦心事的人,还真找不出来。不是我不把我周遭的朋友当朋友看,而是觉得和大家没有到那种可以和人家叨逼叨吐苦水的地步。以前无话不说的故乡伙伴们,也因分别得太过久远而联系渐少。再加上生活环境的差异太大,能聊得来的话题也越来越少。

人活一辈子,最难的事莫过于认清自己吧?我一直自认是一个有责任心,不管对工作、生活还是对家庭、婚姻都还算愿意付出十分努力的人,但不知为何总觉得压力越来越大,以至于我现在不知应该是要对生活绝望,还是要对自己绝望。这种不安的感觉与日俱增,这难道就是而立之年应该有的状态么?

很怀念自己刚到温哥华时,那段虽然辛苦但很单纯快乐的日子。那时的我住地下室,但依然觉得阳光无比灿烂,每天和室友的集体生活也温馨美好。那时的我喜欢畅想未来,想着自己在温哥华五年、十年以后的生活。现在的我,身处于当时的“未来”,却不知道自己现在是否还如当初所想那样。

越长大越孤单 越长大越不安

也不得不看梦想的翅膀被折断

也不得不收回曾经的话问自己

你纯真的眼睛哪去了

越长大越孤单 越长大越不安

也不得不 打开保护你的降落伞

也突然间 明白未来的路 不平坦

难道说 这改变是 必然

俩中国人在停车场用英语吵架…

在有中国人聚居的英语国家,碰到中国人互相讲奇怪的英语是常有的事。在我居住的城市Richmond,有多达一半居民为华人。几年前有次在一家超市的停车场听到两个华人用英语吵架,内容让我到现在都记忆犹新。

当时是周日下午,我开车到市中心的佳廉超市(PriceSmart)买东西,停车场车满为患,一位难求。我好不容易找好停车位,下车走向超市入口时,发现入口不远处有两个亚裔面孔的车主因为争一个车位而吵得面红耳赤。走近一听,其中一个大妈应该是香港人,讲一口标准“港式英语”,而另一个小伙儿一听口音就是北方人。俩人都知道对方是华人,但出于某种默契,一直用蹩脚的英语表达着一些愤怒的情绪。

大妈嚷嚷了一会儿,忽然大喊了一句“Go back to your China”,结合当时的语气,翻译成中文应该是“滚回你们中国去!”(很多香港人不认为自己是中国人)

小伙儿也不示弱,回一句“Say hi to your mother!” 这个非常有中国特色,文明点翻译是“替我问候你老母”,说得通俗点就是“ * 你妈的”。不知道旁边的老外听到这句话做啥感想,不过大妈立刻心领神会,反应也挺快,马上接一句“Say hi to your grandma!”就开车走了。