sort asc依赖于两个字段 - 多维排序

时间:2014-03-27 10:58:07

标签: php sorting kohana

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '12/03/1980'),
    array('aa', 'name' => 'Paul', 'number' => 13, 'birthday' => '12/03/1980'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

我想对上面的数组进行排序。

首先,我想按birthday对数组进行排序。从那个birthday我希望按number排序数组。我不像这样输出数组,< / p>

$data = array(
        array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'), 
        array('aa', 'name' => 'Paul', 'number' => 13, 'birthday' => '12/03/1980'),
        array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '12/03/1980'),
        array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),        
    );

从各种链接我得到了这个解决方案,这个解决方案不能正常工作,它只按数字排序值

  usort($array, function($a, $b) { 
        $rdiff = $a->birthday - $b->birthday;
        if ($rdiff) return $rdiff; 
        return $a->number - $b->number; 
  });

1 个答案:

答案 0 :(得分:0)

问题是生日是一个字符串。您需要先使用strtotime将其转换为整数。

$rdiff = strtotime($a->birthday) - strtotime($b->birthday);

由于这些日期是英国格式,您需要将d / m / y之间的斜杠更改为连字符,因为使用斜杠时strtotime期望日期为美国格式,即m / d / y 。从PHP手册:

  

m / d / y dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),然后假设美国人 m / d / y ;而如果分隔符是破折号( - )或点(。),则假定为欧洲 d-m-y 格式。

所以使用:

$rdiff = strtotime(str_replace('/', '-', $a->birthday)) - strtotime(str_replace('/', '-', $b->birthday));