【问题标题】:PHP: Sorting a multidimensional array by an attributePHP:按属性对多维数组进行排序
【发布时间】:2011-11-04 19:36:48
【问题描述】:

我有一个多维数组,如下所示。我想根据[date] 属性对二级数组进行排序。我相信我可以使用 array_multisort,但我不确定如何继续。

我的数组在变量$presentations

Array
(
    [0] => Array
        (
            [date] => 20111104
            [name] => Name of Presentation
        )

    [1] => Array
        (
            [date] => 20111118
            [name] => sadf
        )

    [2] => Array
        (
            [date] => 20100427
            [name] => older one
        )

    [3] => Array
        (
            [date] => 20101213
            [name] => Another one from 2010
        )

    [4] => Array
        (
            [date] => 20110719
            [name] => sdf
        )

    [5] => Array
        (
            [date] => 20110614
            [name] => Sixth one
        )

)

【问题讨论】:

  • 您需要使用usort() 进行回调。请参阅链接的问题。
  • 我检查了这一点,但希望对这个特定案例有所帮助。我帮助我在 SO 上的公平份额,所以请不要关闭它。
  • Tim Cooper 在下面的回答就是当时。
  • @Wes 我添加了一个使用原生 PHP 函数(实际上是 C 函数)的答案。蒂姆的回答对不相等的值进行了两次比较(通常情况并非如此)。我的回答进行了 1 次比较,因此速度更快。但是,在这种情况下,性能可能无关紧要。这也是不区分大小写的,这是 Tim 的代码所没有的。

标签: php arrays multidimensional-array


【解决方案1】:

usort 回调应根据具体情况返回 3 种类型的值:

  • 如果参数$a 小于$b,则为负数
  • 如果参数$b 小于$a,则为正数
  • 如果$a$b 相等则为零
usort($presentations, function($a, $b)
{
    if($a['date'] == $b['date'])
    {
        return 0;
    }
    return $a['date'] < $b['date'] ? -1 : 1;
});

【讨论】:

  • 简单:如果相等,返回0,如果小于,返回负数,如果大于,返回正数。这就是排序算法通常的工作方式。
【解决方案2】:

您可以使用usort() 应用自定义比较功能。

usort($presentations, 
      function ($left, $right) {
          return $left['date'] - $right['date'];
      });

【讨论】:

  • 我从来没有想过要以简单的方式做到这一点。出于习惯,我总是以两个 ifs 结尾。
  • @thetaiko - 是的,当你的数字减去时不会导致溢出时,这很好用。
【解决方案3】:

这是一个字符串实现,它可以在 PHP 中使用整数,因为类型杂乱:

usort($presentations, function($a, $b) {
    return strcmp($a['date'], $b['date']);
});

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2012-06-15
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2016-09-27
    相关资源
    最近更新 更多