PHP:根据值列表对多维数组进行排序

5

给定以下数组:

Array
(
    [0] => Array
        (
            [status] => closed
            [userModifiedAt] => 2015-12-09T11:47:46Z
        )

    [1] => Array
        (
            [status] => active
            [userModifiedAt] => 2016-02-08T16:43:26Z
        )

    [2] => Array
        (
            [status] => closed
            [userModifiedAt] => 2016-03-31T03:47:19Z
        )

    [3] => Array
        (
            [status] => pending
            [userModifiedAt] => 2015-12-08T14:09:58Z
        )

我希望按照状态[status]排序,顺序为: - 等待中 - 活动中 - 已关闭
对于每个状态,都按照用户最后修改时间[userModifiedAt]排序。
我正在使用以下代码:
usort($array, function($a,$b){ return strcmp($a['status'], $b['status']);} );

但是按照字母顺序排序,因此状态的顺序如下: - 活跃的 - 关闭的 - 待定的

如何根据预定义的顺序列表对数组进行排序?

1个回答

7
这将是一项技巧 -
## A array with the orders to be considered
$order = array('active' => 1, 'closed' => 2, 'pending' => 3);

usort($array, function($a, $b) use($order) { // Use the order array to compare
    return $order[$a[status]] - $order[$b[status]];
});

var_dump($array);

输出

array(4) {
  [0]=>
  array(2) {
    ["status"]=>
    string(6) "active"
    ["userModifiedAt"]=>
    string(20) "2016-02-08T16:43:26Z"
  }
  [1]=>
  array(2) {
    ["status"]=>
    string(6) "closed"
    ["userModifiedAt"]=>
    string(20) "2015-12-09T11:47:46Z"
  }
  [2]=>
  array(2) {
    ["status"]=>
    string(6) "closed"
    ["userModifiedAt"]=>
    string(20) "2016-03-31T03:47:19Z"
  }
  [3]=>
  array(2) {
    ["status"]=>
    string(7) "pending"
    ["userModifiedAt"]=>
    string(20) "2015-12-08T14:09:58Z"
  }
}

如果您想改变顺序,请更改array的顺序。具有最低值的键将是array上的第一个。如果您想让closed排在第一位,则在$order数组中为它提供最低的值。

演示


3
好的,所以你也会魔法吗?:) 不知道! - Hanky Panky
现在处于初学者水平。@HankyPanky :) - Sougata Bose
@Sougata 谢谢,太完美了! - Daniele B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接