如何在多维数组中使用usort?

时间:2016-03-25 17:12:51

标签: php loops sorting multidimensional-array

我有这个多维数组

[
    "/api/dns" => [
        0 => [
            "method" => "GET",
            "uri" => "foo0"
        ],
        1 => [
            "method" => "GET",
            "uri" => "foo1"
        ],
        2 => [
            "method" => "GET",
            "uri" => "foo2"
        ]
    ],
    "/api/servers" => [
        0 => [
            "method" => "GET",
            "uri" => "foo0"
        ],
        1 => [
            "method" => "GET",
            "uri" => "foo1"
        ],
        2 => [
            "method" => "GET",
            "uri" => "foo2"
        ]
    ]
];

我正在尝试按uri排序。

我尝试使用usort这样:

usort($myArray, function ($a, $b) {
   return $a['uri'] - $b['uri'];
});

但这不起作用,因为排序没有在正确的数组上完成,所以我得到了错误:

  

未定义的索引:uri

我尝试在没有结果的foreach中添加此函数。我不知道为什么这不起作用,因为排序是在正确的数组上完成的。

foreach ($myArray as $key) {
    usort($key, function ($a, $b) {
        return $a['uri'] - $b['uri'];
    });
}

这可以用usort吗?

如何使用uri功能按usort排序?

1 个答案:

答案 0 :(得分:1)

当您遍历第一级时,修改子阵列"参考"使用&符号。

代码:(演示:https://3v4l.org/DthZW

foreach($myArray as &$subarray){  // modify by reference
    usort($subarray,function($a,$b){
        return $a['uri']<=>$b['uri'];  // use spaceship operator for ASC sorting 
    });
}
var_export($myArray);

如果您不想使用&,则可以在迭代时覆盖。

foreach ($myArray as $key=>$subarray){
    usort($subarray,function($a,$b){
        return $a['uri']<=>$b['uri'];
    });
    $myArray[$key]=$subarray;  // overwrite
}

或者,您可以将array_multisort()array_column()合并:

代码:(演示:https://3v4l.org/sOEqZ

foreach($myArray as &$subarray){
    array_multisort(array_column($subarray,'uri'),$subarray);
}
var_export($myArray);

同样,您也可以使用此方法执行迭代覆盖。