许多程序员更喜欢使用true 作为json_decode 的第二个参数,因为返回的assoc 数组 将与您在javascript 中处理对象的方式非常相似。
返回一个正确的对象需要阅读有关如何使用和不使用此类的信息,并且由于大多数程序员都非常熟悉关联数组,因此更可取,尤其是如果代码将由一组开发人员维护。代码应该易于理解。
关于性能问题,我认为您无需担心,因为大多数(所有)情况下的瓶颈都在其他地方。除非你正在解析一个巨大的字符串,我的意思是真的很大,否则你不需要做任何基准测试。我相信返回一个 assoc 数组和一个正确的对象之间的区别会很小。
性能基准(解析)
我找到了一个相当大的 json 字符串 here 并进行了一些调整以使其更大,最终大小为 84 578 字节。
然后,我使用两种替代方法(关联数组与对象)分别解析字符串 1000 次,并运行了 3 次测试。结果如下:
第一次运行
JSON object exec: 4.06122 s
JSON assoc exec: 3.28679 s
-------------------------------------
assoc is faster by 19.07%
第二次运行
JSON object exec: 4.09614 s
JSON assoc exec: 3.29216 s
-------------------------------------
assoc is faster by 19.63%
第三次运行
JSON object exec: 4.08762 s
JSON assoc exec: 3.29960 s
-------------------------------------
assoc is faster by 19.28%
性能基准(读/写)
这个基准是为了显示stdObject 和Array() 中的哪一个更快,我使用的是一个解析后的修改过的 json 文件(比之前的基准更大)。
每个读/写测试都运行了 100 000 次(即下面给出的代码被执行了很多次)。
json_decode ($json_data)
for ($i =0; $i < 24; ++$i){
$a = $object[$i]->user->profile_sidebar_border_color . "stackoverflow";
$object[$i]->nested->entities->user_mentions[0]->indices[$i&1] += 1;
}
json_decode ($json_data, true)
for ($i =0; $i < 24; ++$i){
$a = $assoc[$i]['user']['profile_sidebar_border_color'] . "stackoverflow";
$assoc[$i]['nested']['entities']['user_mentions'][0]['indices'][$i&1] += 1;
}
第一次运行
JSON object read/write: 3.05421 s
JSON assoc read/write: 2.51932 s
-------------------------------------
assoc is faster by 17.51%
第二次运行
JSON object read/write: 3.06307 s
JSON assoc read/write: 2.52701 s
-------------------------------------
assoc is faster by 17.50%
第三次运行
JSON object read/write: 3.06109 s
JSON assoc read/write: 2.52248 s
-------------------------------------
assoc is faster by 17.60%
PHP 版本
PHP 5.3.6 (cli)(构建时间:2011 年 8 月 13 日 19:04:57)版权所有 (c) 1997-2011
PHP Group Zend Engine v2.3.0,版权所有 (c) 1998-2011 Zend
技术