最近遇到了一些关于PHP函数相关的问题,在和前辈交流的时候被问及自己所能写出的关于字符串处理和数组相关的函数问题,然后考虑了一下,觉着这些PHP最基础的部分可能在面试中小型公司的时候会被经常问到,在之前的求职面试里面自己更多的注重了数据结构,算法或者数据库相关的这些知识点,对于PHP的基础相关的知识点在工作中也是常常不能熟悉的运用,一般的状态更多是知道有这个函数在,然后百度或者查下手册,在解决了自己的问题之后便降至抛之脑后,虽然能够回答出来一部分函数,但是前辈在深入的问及关于函数有几个参数的时候却又是一脸懵逼。在之前个人认为自己在PHP这个语言以及PHP后端开发上面应该是稍微比较驾轻就熟的一个状态,一般的问题应该对自己来说都问题不大了,却被区区函数问题搞得心态爆炸,仔细思考了之后觉得如果我连这些基础的知识点都不能够很熟练的话,那我还有什么话可以说我PHP很熟练。现在准备在空闲时间都能够思考一下自己所用过的函数或者其他知识点,也希望能够让自己的思考成为惯性。
今天主要看了一下json_encode函数的参数以及使用,以下主要是对json_encode第2/3个参数的一些自己认为的解析。
首先看一下php.net中关于json_encode的说明:
Description
string json_encode ( mixed $value
[, int $options
= 0 [, int $depth
= 512 ]] )
Returns a string containing the JSON representation of the supplied value // 返回json格式的字符串
The encoding is affected by the supplied options
and additionally the encoding of float values depends on the value of serialize_precision. // 所返回json格式的字符串取决于第二个参数
一: json_encode常常被用于将数组转换成json格式的字符串来表示,但是json_encode的第一个参数却并不一定是数组格式,第一个参数可以为对象,数组,字符串。
$array = [
'a' => 'he',
'b' => 'llo',
'c' => 'world',
'd' => [
1 => 'a',
2 => 'b',
3 => 'c'
]
];
// 参数为普通数组 string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($array));
// 将数组先转为json格式字符串,再使用json_decode转为对象,之后详细研究json_decode的参数,使用等
$obj = json_decode(json_encode($array));
// 参数为对象 string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($obj));
// 参数为字符串
// string(90) ""{\"a\":\"he\",\"b\":\"llo\",\"c\":\"world\",\"d\":{\"1\":\"a\",\"2\":\"b\",\"3\":\"c\"}}""
var_dump(json_encode(json_encode($obj)));
var_dump(json_encode('h"e\l/l[o')); // string(14) ""h\"e\\l\/l[o""
var_dump('h"e\l/l[o'); //string(9) "h"e\l/l[o"
可以发现object和array类型转换为json字符串之后没有差别,而string被json_encode之后,string中的【'】,【"】,【\】,【/】会被转义。
二:接下来看一下第二个参数:
options参考选自原文:https://blog.csdn.net/qd824692746/article/details/50912723
JSON_HEX_TAG (integer) 所有的 < 和 > 转换成 \u003C 和 \u003E。 自 PHP 5.3.0 起生效。
JSON_HEX_AMP (integer) 所有的 & 转换成 \u0026。 自 PHP 5.3.0 起生效。
JSON_HEX_APOS (integer) 所有的 ' 转换成 \u0027。 自 PHP 5.3.0 起生效。
JSON_HEX_QUOT (integer) 所有的 " 转换成 \u0022。 自 PHP 5.3.0 起生效。
JSON_FORCE_OBJECT (integer) 使一个非关联数组输出一个类(Object)而非数组。 在数组为空而接受者需要一个类 (Object)的时候尤其有用。 自 PHP 5.3.0 起生效。
JSON_NUMERIC_CHECK (integer) 将所有数字字符串编码成数字(numbers)。 自 PHP 5.3.3 起生效。
JSON_BIGINT_AS_STRING (integer) 将大数字编码成原始字符原来的值。 自 PHP 5.4.0 起生效。
JSON_PRETTY_PRINT (integer) 用空白字符格式化返回的数据。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_SLASHES (integer) 不要编码 /。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_UNICODE (integer) 以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。 自 PHP 5.4.0 起生效。
大家可以参考以上罗列出来的常量测试一下。也可以选取自己业务逻辑上的来达到自己的目的。
三:接下来说一下第三个参数,在本人购买的PHP中文手册中发现json_encode函数中只有以上两个参数,并没有第三个参数depth,在查阅PHP官方文档中是有这个参数的,但是文档中并没有详细的解释以及示例。猜测大概率是PHP版本的问题,也许购买的中文手册是基于旧版本的,官方文档是最新版。在测试中发现第三个参数的不同导致的输出是有区别的。
// 数组深度为2
$array = [
'a' => '"\/hello',
'b' => '\world',
'c' => '/php_json_decode',
'd' => [
1 => '"\/php',
2 => '//\js',
3 => 'python',
4 => 'golang'
]
];
var_dump(json_encode($array,0,1)); // bool(false)
var_dump(json_encode($array,0,2));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
var_dump(json_encode($array,0,3));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
var_dump(json_encode($array,0,4));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
// 数组深度为3
$array = [
'a' => '"\/hello',
'b' => '\world',
'c' => '/php_json_decode',
'd' => [
1 => '"\/php',
2 => '//\js',
3 => 'python',
4 => 'golang'
],
'e' => [
'xxx' => [
'hello' => 'world'
]
]
];
var_dump(json_encode($array,0,1));
// bool(false)
var_dump(json_encode($array,0,2));
// bool(false)
var_dump(json_encode($array,0,3));
// string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"
var_dump(json_encode($array,0,4));
// string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"
发现假如depth的值小于数组的维度的话会输出bool(false),反之正常解析成json串。不知道这个字段存在的意义,希望各位大佬给出正解。