代码之家  ›  专栏  ›  技术社区  ›  Sam Becker

PHP:按数组值的长度对数组排序?

  •  51
  • Sam Becker  · 技术社区  · 15 年前

    有人知道怎么做吗?

    8 回复  |  直到 15 年前
        1
  •  153
  •   Unknown    15 年前

    使用 http://us2.php.net/manual/en/function.usort.php

    使用此自定义函数

    function sort($a,$b){
        return strlen($b)-strlen($a);
    }
    
    usort($array,'sort');
    

    另外,我认为我的版本更好,因为usort是一种不稳定的类型。

    $array = array("bbbbb", "dog", "cat", "aaa", "aaaa");
    // mine
    [0] => bbbbb
    [1] => aaaa
    [2] => aaa
    [3] => cat
    [4] => dog
    
    // others
    [0] => bbbbb
    [1] => aaaa
    [2] => dog
    [3] => aaa
    [4] => cat
    
        2
  •  61
  •   xlttj    13 年前

    如果您想用PHP5.3的方式,您可能需要创建如下内容:

    usort($array, function($a, $b) {
        return strlen($b) - strlen($a);
    });
    

    这样,您就不会污染全局命名空间。

    但是,只有当您需要在源代码中的某个位置使用它以保持干燥时,才可以这样做。

        3
  •  38
  •   ZhenhangTung    9 年前

    PHP7就要来了。在PHP7中,您可以使用 Spaceship Operator

    usort($array, function($a, $b) {
        return strlen($b) <=> strlen($a);
    });
    

    希望这能对你将来有所帮助。

        4
  •  10
  •   zalew    15 年前
    function sortByLength($a,$b){
      if($a == $b) return 0;
      return (strlen($a) > strlen($b) ? -1 : 1);
    }
    usort($array,'sortByLength');
    
        5
  •  3
  •   Swadhin Saha    5 年前

    降序排列:

    $array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];
    
    usort($array, function($a, $b){
       return strlen($a) < strlen($b);
    });
    
    var_export($array);
    
    // Output
    array (
      0 => 'ertre',
      1 => 'ccc',
      2 => 'aa',
      3 => 'bb',
      4 => 'c',
      5 => 'a',
    )
    
    

    升序:

    $array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];
    
    usort($array, function($a, $b){
       return strlen($a) > strlen($b);
    });
    
    // Output
    array (
      0 => 'c',
      1 => 'a',
      2 => 'aa',
      3 => 'bb',
      4 => 'ccc',
      5 => 'ertre',
    )
    
        6
  •  1
  •   Aliaksei Kliuchnikau poncius    13 年前

    strlen oyur数组元素的 multisort

    foreach($Yourarray as $c=>$key) {               
        $key['maxlen'] = strlen($key);  
        $sort_numcie[] = $key['maxlen'];
    }
    
    array_multisort($sort_numcie, $Yourarray);  
    

    这肯定会奏效。我敢肯定!

        7
  •  0
  •   RafaSashi    10 年前

    升序还是降序 :

    function strlen_compare($a,$b){
        if(function_exists('mb_strlen')){
             return mb_strlen($b) - mb_strlen($a);
        }
        else{
             return strlen($b) - strlen($a);
        }
    }
    
    function strlen_array_sort($array,$order='dsc'){
        usort($array,'strlen_compare');
        if($order=='asc'){
            $array=array_reverse($array);
        }
        return $array;
    }
    
        8
  •  0
  •   NIKHIL NEDIYODATH    5 年前
    array_multisort(array_map('count', $arr), SORT_DESC, $arr);
    
        9
  •  0
  •   will    5 年前

    下面是一种使用spaceship操作符的方法(需要PHP7.0):

    $arr = ['apple','pear','oranges','banana'];
    usort($arr, function ($a, $b) { return (strlen($a) <=> strlen($b)); });
    print_r($arr);
    
        10
  •  -1
  •   joebeeson    15 年前

    这是我过去做过的一种方法。

    // Here's the sorting...
    $array = array_combine($words, array_map('strlen', $words));
    arsort($array);
    
        11
  •  -8
  •   Gumbo    13 年前

    很简单。

    function LSort(a,b){return a.length-b.length;}
    
    var YourArray=[[1,2,3,4,5,6], ['a','b'], ['X','Y','Z'], ['I','Love','You'], ['good man']];
    
    YourArray.sort(Lsort);
    

    结果:

    ['good man'] Length=1
    ['a','b'] Length=3
    ['X','Y','Z'] Length=3
    ['I','Love','You'] Length=3
    [1,2,3,4,5,6] Length=6