使用第二维键的稳定排序数组

时间:2013-04-18 12:01:22

标签: php sorting

我必须使用返回JSON的webservice。解码JSON后,我得到数组:

$arrays[0]["2013-04-09"]=$someValue;
$arrays[1]["2013-04-09"]=$someValue;
$arrays[2]["2013-04-11"]=$someValue;
$arrays[3]["2013-04-05"]=$someValue;
$arrays[4]["2013-04-09"]=$someValue;

我想要排序(稳定方式并使用第二个暗键的键)数组并得到结果:

$arrays[3]["2013-04-05"];
$arrays[0]["2013-04-09"]; //stable way don't swap with next val
$arrays[1]["2013-04-09"]; //stable way don't swap with next and prev vel
$arrays[4]["2013-04-09"]; //stable way, don't swap with prev val
$arrays[2]["2013-04-11"];
你能帮帮我吗?我尝试创建自己的排序功能,因为只使用第一个昏暗键,ksort或krsort排序。谢谢你的回答。

编辑: 我尝试编写自己的函数 - 这样做 - 我的单元测试中出现错误的“有效答案”,这就是我说这不起作用的原因:

private function getResult(){
...
usort($arrays,array($this,'mycmp'));
...
}
private function mycmp($a, $b){
    foreach($a as $key=>$val){
        $first = $key;
    }
    foreach($b as $key=>$val){
        $second = $key;
    }

    if ($first == $second){
        return 0;
    }
    return ($first < $second) ? -1:1;

}

感谢帮助

1 个答案:

答案 0 :(得分:0)

假设每个子数组都在同一位置具有日期键(例如,始终是对象中的第一个键),您可以执行以下操作:

$keyPosition = 0; // location of the key in the array structures

usort($data, function ($a, $b) use ($keyPosition) {
    $aKeys = array_keys($a);
    $bKeys = array_keys($b);

    return strcmp($aKeys[$keyPosition], $bKeys[$keyPosition]);
});

然而,您应该注意的是PHP no longer supports stable sorting,因此您可能无法获得与之前完全相同的顺序。如果这是绝对要求,您可能需要滚动自己的排序功能。 Here's a Gist that might help