调整usort函数以对2个字段之一进行排序

时间:2012-11-23 18:08:59

标签: php

我有两种类型的数组字段,我想按照它们排序:

第一个是 registration_date ,第二个是 preregistration_date

这是print_r数组输出(存储在变量 $ unsorted_users 中):

Array
(
    [0] => stdClass Object
        (
            [id] => 120
            [registration_date] => 2012-10-19 16:57:46
            [username] => Jeff
        )
    [1] => stdClass Object
        (
            [id] => 121
            [preregistration_date] => 2012-12-23 16:57:46

        )
    [2] => stdClass Object
        (
            [id] => 122
            [registration_date] => 2012-11-30 16:57:46
            [username] => Susan
        )

)

我想通过 registration_date preregistration_date 订购此阵列 DESC ,所以它看起来像这样:

阵     (          [0] => stdClass对象             (                 [id] => 121                 [preregistration_date] => 2012-12-23 16:57:46

        )
    [1] => stdClass Object
        (
            [id] => 122
            [registration_date] => 2012-11-30 16:57:46
            [username] => Susan

        )
    [2] => stdClass Object
        (
            [id] => 120
            [registration_date] => 2012-10-19 16:57:46
            [username] => Jeff

        )

)

我的usort功能是:

$sorted_users = usort($unsorted_users, function($a, $b) {
   return strcmp ($a->registration_date, $b->registration_date) ;
});

但是,它只是按 registration_date 排序,如果没有registration_date,例如:

 [1] => stdClass Object
            (
                [id] => 121
                [preregistration_date] => 2012-12-23 16:57:46

            )

我收到错误。

如何调整我的功能,使其为registration_date或preregistation_date排序?

顺便说一下。 registration_date和preregistration_date的格式始终相同,并且两者都不能在一个对象中。所以,这不需要验证。

提前致谢。

1 个答案:

答案 0 :(得分:2)

喜欢这个吗?

$sorted_users = usort($unsorted_users, function($a, $b) {
   $registrationDateA = empty($a->registration_date) ? 
      $a->preregistration_date : $a->registration_date;
   $registrationDateB = empty($b->registration_date) ? 
      $b->preregistration_date : $b->registration_date;
   return strcmp ($registrationDateA, registrationDateB) ;
});