duanpa1898 2018-03-26 22:24
浏览 89
已采纳

按年度到数值对按字母顺序和数字排序数组

Am looking over the PHP manual on Array Sorting but cannot seem to get this in the proper order.

Basically in my PHP script I'm getting an array of Year Make Models and Engines, and then using array_unique to get only the unique Year Make and Models.

Array
(
    [0] => 2012 Jeep Liberty
    [7] => 2011 Jeep Liberty
    [12] => 2010 Jeep Liberty
    [15] => 2009 Jeep Liberty
    [18] => 2008 Jeep Liberty
    [22] => 2007 Jeep Liberty
    [26] => 2006 Jeep Liberty
    [33] => 2006 Jeep Wrangler
    [44] => 2005 Jeep Liberty
    [51] => 2005 Jeep Wrangler
    [60] => 2004 Jeep Liberty
    [64] => 2004 Jeep Wrangler
    [73] => 2003 Jeep Liberty
    [77] => 2003 Jeep Wrangler
    [86] => 2002 Jeep Liberty
    [92] => 2002 Jeep Wrangler
    [96] => 2001 Jeep Cherokee
    [102] => 2001 Jeep Wrangler
    [106] => 2000 Jeep Cherokee
    [114] => 2000 Jeep Wrangler
    [117] => 1999 Jeep Cherokee
    [125] => 1999 Jeep Wrangler
    [128] => 1998 Jeep Cherokee
    [136] => 1998 Jeep Grand Cherokee
    [149] => 1998 Jeep Wrangler
    [152] => 1997 Jeep Cherokee
    [159] => 1997 Jeep Grand Cherokee
    [169] => 1997 Jeep Wrangler
    [173] => 1996 Jeep Cherokee
    [181] => 1996 Jeep Grand Cherokee
    [186] => 1995 Jeep Cherokee
    [193] => 1995 Jeep Grand Cherokee
    [203] => 1995 Jeep Wrangler
)

What I'm trying to do is sort the array so, not only the years match up, but also the Make and Model. Something like:

Array
(
    [0] => 2012 Jeep Liberty
    [7] => 2011 Jeep Liberty
    [12] => 2010 Jeep Liberty
    [15] => 2009 Jeep Liberty
    [18] => 2008 Jeep Liberty
    [22] => 2007 Jeep Liberty
    [26] => 2006 Jeep Liberty
    [44] => 2005 Jeep Liberty
    [60] => 2004 Jeep Liberty
    [73] => 2003 Jeep Liberty
    [86] => 2002 Jeep Liberty
    [33] => 2006 Jeep Wrangler
    [51] => 2005 Jeep Wrangler
    [64] => 2004 Jeep Wrangler
    [77] => 2003 Jeep Wrangler
    [92] => 2002 Jeep Wrangler
    [102] => 2001 Jeep Wrangler 
    [114] => 2000 Jeep Wrangler
    [125] => 1999 Jeep Wrangler
    [149] => 1998 Jeep Wrangler
    [169] => 1997 Jeep Wrangler
    [203] => 1995 Jeep Wrangler
    [96] => 2001 Jeep Cherokee
    [106] => 2000 Jeep Cherokee
    [117] => 1999 Jeep Cherokee
    [128] => 1998 Jeep Cherokee
    [152] => 1997 Jeep Cherokee
    [173] => 1996 Jeep Cherokee
    [186] => 1995 Jeep Cherokee
    [136] => 1998 Jeep Grand Cherokee
    [159] => 1997 Jeep Grand Cherokee
    [181] => 1996 Jeep Grand Cherokee
    [193] => 1995 Jeep Grand Cherokee
)

Or something of that nature (sorted this manually, I will probably do a array_values on the array to re-index the keys) -- I just want the Years and the Make/Models to be sorted properly.

What is my best option here?

  • 写回答

3条回答 默认 最新

  • duanbichou4942 2018-03-26 23:28
    关注

    If you want to sort first the Maker and Model, you can make something like this (assuming the years always have four digits):

    <?php
    usort(
        $array,
        function ($value1, $value2) {
            $parts1 = explode(' ', $value1, 2);
            $parts2 = explode(' ', $value2, 2);
            return strcasecmp(
                "$parts1[1] $parts1[0]",
                "$parts2[1] $parts2[0]"
            );
        }
    );
    print_r($array);
    

    The trick was to rearrange the strings when comparing the order, for instance, "Jeep Cherokee 1995".

    Output:

    Array
    (
        [0] => 1995 Jeep Cherokee
        [1] => 1996 Jeep Cherokee
        [2] => 1997 Jeep Cherokee
        [3] => 1998 Jeep Cherokee
        [4] => 1999 Jeep Cherokee
        [5] => 2000 Jeep Cherokee
        [6] => 2001 Jeep Cherokee
        [7] => 1995 Jeep Grand Cherokee
        [8] => 1996 Jeep Grand Cherokee
        [9] => 1997 Jeep Grand Cherokee
        [10] => 1998 Jeep Grand Cherokee
        [11] => 2002 Jeep Liberty
        [12] => 2003 Jeep Liberty
        [13] => 2004 Jeep Liberty
        [14] => 2005 Jeep Liberty
        [15] => 2006 Jeep Liberty
        [16] => 2007 Jeep Liberty
        [17] => 2008 Jeep Liberty
        [18] => 2009 Jeep Liberty
        [19] => 2010 Jeep Liberty
        [20] => 2011 Jeep Liberty
        [21] => 2012 Jeep Liberty
        [22] => 1995 Jeep Wrangler
        [23] => 1997 Jeep Wrangler
        [24] => 1998 Jeep Wrangler
        [25] => 1999 Jeep Wrangler
        [26] => 2000 Jeep Wrangler
        [27] => 2001 Jeep Wrangler
        [28] => 2002 Jeep Wrangler
        [29] => 2003 Jeep Wrangler
        [30] => 2004 Jeep Wrangler
        [31] => 2005 Jeep Wrangler
        [32] => 2006 Jeep Wrangler
    )
    

    Here's another solution (without the previous assumption):

    <?php
    $enginesYears = array();
    foreach ($array as $value) {
        $parts = explode(' ', $value, 2);
        $year = (int)$parts[0];
        $engine = $parts[1];
        if (!isset($enginesYears[$engine])) {
            $enginesYears[$engine] = array();
        }
        $enginesYears[$engine][] = $year;
    }
    ksort($enginesYears);
    $array = array();
    foreach ($enginesYears as $engine => $years) {
        rsort($years);
        foreach ($years as $year) {
            $array[] = "$year $engine";
        }
    }
    print_r($array);
    

    Output:

    Array
    (
        [0] => 2001 Jeep Cherokee
        [1] => 2000 Jeep Cherokee
        [2] => 1999 Jeep Cherokee
        [3] => 1998 Jeep Cherokee
        [4] => 1997 Jeep Cherokee
        [5] => 1996 Jeep Cherokee
        [6] => 1995 Jeep Cherokee
        [7] => 1998 Jeep Grand Cherokee
        [8] => 1997 Jeep Grand Cherokee
        [9] => 1996 Jeep Grand Cherokee
        [10] => 1995 Jeep Grand Cherokee
        [11] => 2012 Jeep Liberty
        [12] => 2011 Jeep Liberty
        [13] => 2010 Jeep Liberty
        [14] => 2009 Jeep Liberty
        [15] => 2008 Jeep Liberty
        [16] => 2007 Jeep Liberty
        [17] => 2006 Jeep Liberty
        [18] => 2005 Jeep Liberty
        [19] => 2004 Jeep Liberty
        [20] => 2003 Jeep Liberty
        [21] => 2002 Jeep Liberty
        [22] => 2006 Jeep Wrangler
        [23] => 2005 Jeep Wrangler
        [24] => 2004 Jeep Wrangler
        [25] => 2003 Jeep Wrangler
        [26] => 2002 Jeep Wrangler
        [27] => 2001 Jeep Wrangler
        [28] => 2000 Jeep Wrangler
        [29] => 1999 Jeep Wrangler
        [30] => 1998 Jeep Wrangler
        [31] => 1997 Jeep Wrangler
        [32] => 1995 Jeep Wrangler
    )
    

    The trick is to build this first:

    Array
    (
        [Jeep Cherokee] => Array
            (
                [0] => 2001
                [1] => 2000
                [2] => 1999
                [3] => 1998
                [4] => 1997
                [5] => 1996
                [6] => 1995
            )
    
        [Jeep Grand Cherokee] => Array
            (
                [0] => 1998
                [1] => 1997
                [2] => 1996
                [3] => 1995
            )
    
        [Jeep Liberty] => Array
            (
                [0] => 2012
                [1] => 2011
                [2] => 2010
                [3] => 2009
                [4] => 2008
                [5] => 2007
                [6] => 2006
                [7] => 2005
                [8] => 2004
                [9] => 2003
                [10] => 2002
            )
    
        [Jeep Wrangler] => Array
            (
                [0] => 2006
                [1] => 2005
                [2] => 2004
                [3] => 2003
                [4] => 2002
                [5] => 2001
                [6] => 2000
                [7] => 1999
                [8] => 1998
                [9] => 1997
                [10] => 1995
            )
    
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line