Php 对JSON对象数组进行排序:我应该使用“JSON_decode”还是“preg_match”?
我有一个json编码的对象数组,需要使用传递给Php 对JSON对象数组进行排序:我应该使用“JSON_decode”还是“preg_match”?,php,json,performance,sorting,Php,Json,Performance,Sorting,我有一个json编码的对象数组,需要使用传递给usort的自定义比较函数,根据每个对象具有的属性之一进行排序。数据如下所示: [ '{"property-to-sort-by":"value1"}', '{"property-to-sort-by":"value2"}', ... ] 有两种方法可以在比较函数中提取此属性: json\u解码每个对象并比较属性 使用preg_match提取属性进行比较(每个对象一个属性) 哪一种方法更有效,或者有没有其他我没想到的方法更有效?TLD
usort
的自定义比较函数,根据每个对象具有的属性之一进行排序。数据如下所示:
[
'{"property-to-sort-by":"value1"}',
'{"property-to-sort-by":"value2"}',
...
]
有两种方法可以在比较函数中提取此属性:
json\u解码每个对象并比较属性
preg_match
提取属性进行比较(每个对象一个属性)哪一种方法更有效,或者有没有其他我没想到的方法更有效?TLDR:考虑到只需要从每个对象提取一个属性,我发现
preg\u match
比json\u decode
对json编码对象数组进行排序要高效得多
首先,我对最简单的比较函数进行了基准测试,我可以想象它是一个参考点:
$s = microtime();
usort($jsonArray, function($a, $b) {
return 1;
});
$p = microtime() - $s;
var_dump($p);
这个琐碎的案例在.0002微秒多一点的时间内对我的测试列表进行了排序。以下是我的10次试用时间:
0.00022999999999995
0.00022800000000001
0.00022800000000001
0.00023300000000004
0.000217
0.00023899999999999
0.00021699999999999
0.00023000000000001
0.000251
0.00021499999999999
接下来,我对json\u解码方法进行了基准测试:
$s = microtime();
usort($jsonArray, function($a, $b) {
$aOrg = \json_decode( $a );
$bOrg = \json_decode( $b );
return strcasecmp($aOrg->name, $bOrg->name);
});
$p = microtime() - $s;
var_dump($p);
$s = microtime();
usort($jsonArray, function($a, $b) {
preg_match('/"name":"(.+?)"/', $a, $aMatches);
preg_match('/"name":"(.+?)"/', $b, $bMatches);
$aName = $aMatches[1];
$bName = $bMatches[1];
return strcasecmp($aName, $bName);
});
$p = microtime() - $s;
var_dump($p);
此函数在大约0.0008或0.0009毫秒内对我的列表进行排序:
0.00081499999999995
0.00096299999999999
0.000973
0.00081300000000001
0.00081299999999999
0.00084399999999996
0.000931
0.000875
0.000997
0.00081000000000009
0.00047700000000001
0.000448
0.00044799999999995
0.00046199999999996
0.00045200000000001
0.00044999999999995
0.000448
0.000585
0.00045100000000001
0.000449
最后,我测试了preg_match
方法:
$s = microtime();
usort($jsonArray, function($a, $b) {
$aOrg = \json_decode( $a );
$bOrg = \json_decode( $b );
return strcasecmp($aOrg->name, $bOrg->name);
});
$p = microtime() - $s;
var_dump($p);
$s = microtime();
usort($jsonArray, function($a, $b) {
preg_match('/"name":"(.+?)"/', $a, $aMatches);
preg_match('/"name":"(.+?)"/', $b, $bMatches);
$aName = $aMatches[1];
$bName = $bMatches[1];
return strcasecmp($aName, $bName);
});
$p = microtime() - $s;
var_dump($p);
此方法在大约0.0004毫秒内对我的列表进行排序:
0.00081499999999995
0.00096299999999999
0.000973
0.00081300000000001
0.00081299999999999
0.00084399999999996
0.000931
0.000875
0.000997
0.00081000000000009
0.00047700000000001
0.000448
0.00044799999999995
0.00046199999999996
0.00045200000000001
0.00044999999999995
0.000448
0.000585
0.00045100000000001
0.000449
总之,对于我的测试列表,使用preg\u match
进行排序比使用json\u decode
进行排序要少大约三分之一的时间,而不是简单的return 1
实现
$array = json_decode("[".implode(",",$jsonArray)."]");
usort($jsonArray2, function($a, $b) {
return strcasecmp($a->name, $b->name);
});
我确实做了一些测试,但我仍然很困惑,为什么这似乎比基线表现得更快 这是一个不公平的比较。通常,在排序之前,您会执行一次json解码。在sort回调中执行json\u decode
意味着您将在每次比较中进行解码,并且将有大约O(n logn)个比较。另外,如何以json字符串数组开始?@apokryfos我在数据库中存储json对象,因此json对象数组是查询数据库的结果。