【问题标题】:Sort array by multiple values in PHP在PHP中按多个值对数组进行排序
【发布时间】:2015-02-19 11:59:08
【问题描述】:

我有一个名字数组,我需要对其进行排序

  1. 姓氏
  2. 名字
  3. 英里

我可以使用 usort 按一个字段(即姓氏)排序

usort($name_apha, function($a, $b) {
   return $a['ln'] - $b['ln'];
});

但这只能让我走上 1/3 的路。

问题:如何对所有三个字段(ln,fn 他们 mi)进行排序以获得正确的结果?以下是需要排序的数据示例。

array (size=5)
  0 => 
    array (size=4)
      'ID' => int 425
      'ln' => string 'Bolware' (length=10)
      'fn' => string 'Christian' (length=9)
      'mi' => string '' (length=0)
  1 => 
    array (size=4)
      'ID' => int 423
      'ln' => string 'Bernstein' (length=9)
      'fn' => string 'Bear' (length=5)
      'mi' => string 'D.' (length=2)
  2 => 
    array (size=4)
      'ID' => int 419
      'ln' => string 'Bellweather' (length=7)
      'fn' => string 'Brent' (length=9)
      'mi' => string '' (length=0)
  3 => 
    array (size=4)
      'ID' => int 356
      'ln' => string 'Bayleaf, III' (length=13)
      'fn' => string 'Joe' (length=5)
      'mi' => string 'X.' (length=2)
  4 => 
    array (size=4)
      'ID' => int 336
      'ln' => string 'Public' (length=6)
      'fn' => string 'John' (length=4)
      'mi' => string 'Q.' (length=2)

【问题讨论】:

  • 它并不完美,但您可以连续排序 3 次,首先是不太重要的字段 (mi),然后是第二个字段 (fn),最后是最重要的字段 (ln)。
  • 不知道你为什么在里面有长度?您是否想要第一个字段最重要,然后是第二个等的字典排序(字母顺序)?
  • 如果我search Stack Overflow for the title of this post,我会得到很多与您的情况非常相似的结果。你确定他们都没有回答你的问题吗?
  • @Paul Crovella 很高兴知道。从现在开始会做。

标签: php


【解决方案1】:

为什么不直接连接比较中的三个字段?即:

return ($a['ln'] . $a['fn'] . $a['mi']) - ($b['ln'] . $b['fn'] . $b['mi']);

这将返回正确的排序,包括 ln 或 ln+fn 上的关系。

【讨论】:

  • 这不起作用。仅仅因为您将字符串与减法进行比较。
【解决方案2】:

首先,不要使用减法来比较字符串;使用strcmp(或strcasecmp进行不区分大小写的比较)。

要比较所有三个值,您可以使用三元运算符? : 的级联,如下所示:

usort($name_alpha, function($a, $b) {
    return strcmp($a['ln'], $b['ln']) // will return this if it is not 0
        ?
        : strcmp($a['fn'], $b['fn']) // will return this if it is not 0
            ?
            : strcmp($a['mi'], $b['mi']);  // will return this if it made it this far
});

DEMO

完整的代码如下所示:

$name_alpha = array (
    0 =>
        array (
            'ID' => 425,
            'ln' => 'Bolware',
            'fn' => 'Christian',
            'mi' => '',
        ),
    1 =>
        array (
            'ID' => 423,
            'ln' => 'Bernstein',
            'fn' => 'Bear',
            'mi' => 'D.',
        ),
    2 =>
        array (
            'ID' => 419,
            'ln' => 'Bellweather',
            'fn' => 'Brent',
            'mi' => '',
        ),
    3 =>
        array (
            'ID' => 356,
            'ln' => 'Bayleaf, III',
            'fn' => 'Joe',
            'mi' => 'X.',
        ),
    4 =>
        array (
            'ID' => 336,
            'ln' => 'Public',
            'fn' => 'John',
            'mi' => 'Q.',
        )
);

usort($name_alpha, function($a, $b) {
    return strcmp($a['ln'], $b['ln']) // will return this if it is not 0
        ?
        : strcmp($a['fn'], $b['fn']) // will return this if it is not 0
            ?
            : strcmp($a['mi'], $b['mi']);  // will return this if it made it this far
});

print_r($name_alpha);

输出是:

Array
(
    [0] => Array
        (
            [ID] => 356
            [ln] => Bayleaf, III
            [fn] => Joe
            [mi] => X.
        )
    [1] => Array
        (
            [ID] => 419
            [ln] => Bellweather
            [fn] => Brent
            [mi] => 
        )
    [2] => Array
        (
            [ID] => 423
            [ln] => Bernstein
            [fn] => Bear
            [mi] => D.
        )
    [3] => Array
        (
            [ID] => 425
            [ln] => Bolware
            [fn] => Christian
            [mi] => 
        )
    [4] => Array
        (
            [ID] => 336
            [ln] => Public
            [fn] => John
            [mi] => Q.
        )
)

【讨论】:

  • 不错!谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多