【问题标题】:How to sort an array of names by surname preserving the keys如何按姓氏对名称数组进行排序,保留键
【发布时间】:2012-02-21 00:46:12
【问题描述】:

我有一个数组如下:

Array(
    [27] => 'Sarah Green',
    [29] => 'Adam Brown',
    [68] => 'Fred Able'
);

我想按姓氏排序并保留键:

Array(
    [68] => 'Fred Able'
    [29] => 'Adam Brown',
    [27] => 'Sarah Green'
);

有些名字可能有两个以上的名字,但它始终是我想要排序的姓氏。

在 PHP 中最好的方法是什么?

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    您可以使用uasort 函数,它允许您指定自定义排序方法,同时还保留键:

    <?php
    // A function to sort by last name.
    function lastNameSort($a, $b) {
        $aLast = end(explode(' ', $a));
        $bLast = end(explode(' ', $b));
    
        return strcasecmp($aLast, $bLast);
    }
    
    // The array of data.
    $array = array(
        27 => 'Sarah Green',
        29 => 'Adam Brown',
        68 => 'Fred Able'
    );
    
    // Perform the sort:
    uasort($array, 'lastNameSort');
    
    // Print the result:
    print_r($array);
    ?>
    

    Here's a demo.

    【讨论】:

    • 反应迅速。但是,与实际结果无关,end 将其参数作为参考。这将导致“严格标准”错误。要修复,只需先将 explode(' ', $a)explode(' ', $b) 分配给变量。抱歉,只是吹毛求疵。
    • @bob-the-destroyer:啊,好吧。感谢您指出了这一点!吹毛求疵很好:)
    • 工作得很好,谢谢,而且比我没有快速实现的想法要优雅得多!还要感谢 @bob-the-destroyer 的提示。
    • @bob-the-destroyer:是的,这只是一个示例函数。
    • @minitech:点了。剩下的交给 OP 吧。
    【解决方案2】:
    function sortByLastName($a){
        $tmp = $a;
        foreach($tmp as $k => $v){
            $tmp[$k] = substr($v,strrpos($v, ' ')+1);
        }
        asort($tmp);
        $ret = array();
        foreach($tmp as $k => $v){
            $ret[$k] = $a[$k];
        }
        return $ret;
    }
    

    也许不是最快的方法,但它有效。如果他们也有中间名,它也有效。

    这比接受的答案要快。

    http://codepad.org/ogGibRpH

    【讨论】:

      【解决方案3】:

      我认为您不能直接使用 PHP 的内置数组排序来执行此操作 - 尽管如果有人对此进行纠正我会很感兴趣。

      最简单的方法是颠倒名称,使其变为 Green, Sarah,因为这样您就可以使用 PHP 自己的排序功能,例如使用 asort() (维护键关联)。

      如果这不可行,您可能需要实现自己的自定义排序功能。最简单的方法是使用 usort() ,它允许您定义自定义比较器函数。比如:

      usort($arr, "sortByLastName");
      
      function sortByLastName($a, $b) {
           //DO YOUR COMPARISON IN HERE
      }
      

      【讨论】:

        【解决方案4】:

        可能与此类似(尚未测试)

        function sortSurname($a,$b){
          $sur_a = array_pop(explode(' ',$a));
          $sur_b = array_pop(explode(' ',$b));
          return $sur_a < $sur_b;
        }
        
        usort($array, 'sortSurname')
        

        【讨论】:

          【解决方案5】:

          我不确定是否有按姓氏对示例数组进行排序的直接方法。

          您可以以不同的方式将名称添加到数组中。即“Fred Able”将变为“Able, Fred”。这将允许您使用 PHP 的内置数组排序功能。

          否则,您可能必须遍历每个数组元素并按空格展开,使用返回数组的最后一块作为您的姓氏。有点乱,但我敢肯定那里有大量示例和函数。

          【讨论】:

            【解决方案6】:

            您可能希望使用姓氏创建一个辅助数组,保留密钥,对其排序,然后重建原始数组:

            function order_by_surname($names) {
                foreach ($names as $key => $name) {
                    $surnames[$key] = array_pop(explode(' ', $name));
                }
                asort($surnames);
                foreach ($surnames as $key => $surname) {
                    $ordered[$key] = $names[$key];
                }
                return $ordered;
            

            }

            另外,请注意,您可能会遇到问题,因为当您有两个姓氏时,姓氏并不总是全名的最后一个单词(例如 John Clark Moore)。

            【讨论】:

              【解决方案7】:
              <?php
              $names= Array('Fred Able','Adam Brown','Sarah Green');
              
              $new_arr=array();
              
              $clength = count($names);
              for($x = 0; $x < $clength; $x++) {
              
                $y= array_reverse(explode(' ',$names[$x]));
                
                $y=implode(" ",$y);
                
                array_push($new_arr,$y);
                
              }
              
              rsort($new_arr); // for rsort sorting with descending order,  for ASC use sort
              
              print_r($new_arr);
              
              ?>
              

              【讨论】:

              • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
              猜你喜欢
              • 2020-11-03
              • 2015-05-25
              • 2013-11-03
              • 1970-01-01
              • 2019-05-06
              • 1970-01-01
              • 2010-10-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多