【问题标题】:Adjust usort function to sort on one of 2 fields调整 usort 函数以对 2 个字段之一进行排序
【发布时间】:2012-11-24 02:16:59
【问题描述】:

我有两种类型的数组字段,我想根据这些字段进行排序:

第一个是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_datepreregistration_date 订购这个数组 DESC,所以它看起来像这样:

数组 ( [0] => 标准类对象 ( [id] => 121 [预注册日期] => 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 的格式始终相同,并且两者不能在一个对象中。所以,这不需要验证。

提前致谢。

【问题讨论】:

  • 您可以使用property_exists() 在尝试访问之前检查属性是否存在。

标签: php


【解决方案1】:

像这样?

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

【讨论】:

  • 看起来是正确的做法。我会试一试,让你知道它是如何工作的。
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多