PHP: json_encode()

开发过程中经常使用到的API大部分使用JSON作为数据交换的格式,PHP使用json_encode()将PHP的不同类型的变量转换为对应的JSON字符串。虽然经常使用,但直到今天我才注意到原来json_encode()还支持第二个参数options。

函数原型

string json_encode(mixed $value [, int $options = 0])

参数说明

value

value可以为非resource类型的任意PHP变量。

options

目前我本地的PHP版本为5.3.2,因此只试验了5.3.0引入的常量,所有可用的常量以及它们含义可以在JSON Constant页面查看。每一个常量的字面意思表达的都很清楚,不过对于它们的使用场景我还有些疑惑,比如:可不可以混搭使用?

PHP 5.3.0

  • JSON_HEX_QUOT: 将所有的双引号(”)转换为\u0022。
    // 实例代码:
    $data = '"';
    echo json_encode($data); // "\""
    echo json_encode($data, JSON_HEX_QUOT); // "\u0022"
  • JSON_HEX_TAG: 将所有的大于号(>)转换为\u003E,将所有的小于号(<)转换为 \u003C。
  • JSON_HEX_AMP: 将所有的与号(&)转换为 \u0026。
  • JSON_HEX_APOS: 将所有的单引号(’)转换为\u0027。
  • JSON_FORCE_OBJECT: 当value为非关联数组时强制输出结果为JSON对象。在接收者要求数据为对象且value为空数组时使用。
    // 实例代码:
    $data = array();
    echo json_encode($data); // []
    echo json_encode($data, JSON_FORCE_OBJECT); // {}

PHP 5.3.3

  • JSON_NUMERIC_CHECK: Encodes numeric strings as numbers.

PHP 5.4.0

  • JSON_BIGINT_AS_STRING: Encodes large integers as their original string value. Available since PHP 5.4.0.
  • JSON_PRETTY_PRINT: Use whitespace in returned data to format it. Available since PHP 5.4.0.
  • JSON_UNESCAPED_SLASHES: Don’t escape /. Available since PHP 5.4.0.
  • JSON_UNESCAPED_UNICODE: Encode multibyte Unicode characters literally (default is to escape as \uXXXX). Available since PHP 5.4.0.

PS:今天花在浏览网页的时间太多了,也不知道写些什么,最后挑了个简单的话题完成了今天的更新任务。

Update:

多种JSON常量可以混搭使用,如将所有的单引号和双引号转换为对应的16进制Unicode编码:json_encode($data, JSON_HEX_QUOT + JSON_HEX_APOS);

MySQL COUNT(*) vs. COUNT(expr)

最近在的项目中需要进行数据统计,在实现时多次使用到COUNT()函数,涉及的表也包含百万级别的记录,于是借此机会对COUNT()进行了一些研究。

COUNT()函数用来统计表中行的数目或符合特定条件的行的数目。

COUNT() 函数的两种用法:

  1. COUNT(*)  — 统计表中的行的数目或符合特定条件的行的数目;
  2. COUNT(expr) — 统计表中expr字段值不为NULL的行的数目或值不为NULL且符合特定条件的行的数目(即统计时忽略expr字段值为NULL的行)。

以上表明COUNT(*)与COUNT(expr)并不等价。

  1. 当统计的字段值不能为NULL(expr … NOT NULL)时,二者的结果一致;
  2. 当统计的字段值允许为NULL的时候,COUNT(expr)将会遍历所有的记录,找到不为NULL的字段。

对于MyISAM引擎,MySQL会在information_schema.TABLES中存储表的记录行数,因此在使用COUNT(*)统计表的行数的时候,直接返回该值;在统计值可以为NULL的字段的时候,使用COUNT(expr)需要进行遍历,遍历带来的结果将是性能的降低。

以上表明,在进行数据统计的时候,尽可能使用COUNT(*)来获得最佳性能。

参考链接:

  1. MySQL SELECT COUNT(*)

PS:个人感觉对比结果不是很完善,有时间再实践并补充。

Gonna Sailing ;-)
==END==