2

我必须使用返回 JSON 的网络服务。解码 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;

}

感谢帮助

4

1 回答 1

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 不再支持稳定排序,因此您可能无法获得与以前完全相同的排序。如果这是绝对要求,您可能需要滚动自己的排序功能。这是一个可能有帮助的要点

于 2013-04-18T12:10:10.083 回答