【问题标题】:How to use usort inside a multidimensional array?如何在多维数组中使用 usort?
【发布时间】:2016-07-13 11:37:07
【问题描述】:

我有这个多维数组

[
    "/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 可以做到这一点吗?

如何使用usort 函数按uri 排序?

【问题讨论】:

  • 您要对每个子数组进行排序还是对整个数组进行排序,如果需要移动子数组? (只需通过引用通过您的子数组:foreach ($myArray as $key) -> foreach ($myArray as &$key)
  • 另请注意,如果您的uri 键是字母数字,$a['uri'] - $b['uri'] 不起作用。请改用strcmp
  • @Rizier123 要在foreach 中使用usort,他需要使用参考foreach ($myArray as &$key)。默认情况下,$key 是一个副本。没有必要对副本进行排序,因为它将在 foreach 之后被销毁
  • 好的,谢谢大家,我尽快试试这个

标签: php loops sorting multidimensional-array


【解决方案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);

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

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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多