Php 对JSON对象数组进行排序:我应该使用“JSON_decode”还是“preg_match”?

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

我有一个json编码的对象数组,需要使用传递给
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对象数组是查询数据库的结果。