PHP-按键长度对哈希数组排序

PHP-按键长度对哈希数组排序,php,arrays,sorting,key,Php,Arrays,Sorting,Key,我找到了一些关于按值排序的答案,但不是按键排序 我想做的是反向排序,因此: $nametocode['reallylongname']='12'; $nametocode['shortname']='10'; $nametocode['mediumname']='11'; 我希望他们按这个顺序 reallylongname 媒体名称 短名 中名短名 非常感谢看一看。您可以使用用户定义的键排序函数作为uksort的回调: function cmp($a, $b) {

我找到了一些关于按值排序的答案,但不是按键排序

我想做的是反向排序,因此:

    $nametocode['reallylongname']='12';
    $nametocode['shortname']='10';
    $nametocode['mediumname']='11';
我希望他们按这个顺序

  • reallylongname
  • 媒体名称
  • 短名
  • 中名短名


    非常感谢

    看一看。

    您可以使用用户定义的键排序函数作为
    uksort
    的回调:

    function cmp($a, $b)
    {
        if (strlen($a) == strlen($b))
            return 0;
        if (strlen($a) > strlen($b))
            return 1;
        return -1;
    }
    
    uksort($nametocode, "cmp");
    
    foreach ($nametocode as $key => $value) {
        echo "$key: $value\n";
    }
    

    快速提示-要反转排序,只需根据@thetaiko答案切换“1”和“-1”。

    ,并使用更简单的回调:

    function sortByLengthReverse($a, $b){
        return strlen($b) - strlen($a);
    }
    
    uksort($nametocode, "sortByLengthReverse");
    

    资源:
    另一种解决方案使用:


    这里的
    $keys
    $arr
    的密钥长度数组。该数组按降序排序,然后使用
    array\u multisort
    $arr
    的值进行排序一个简单的问题需要一个简单的解决方案;-)


    看看我强大的内联方法。为子孙后代保留全球空间

    uksort($data, create_function('$a,$b', 'return strlen($a) < strlen($b);'));
    
    uksort($data,create_函数('$a,$b','returnstrlen($a)
    我已经对一些排序算法进行了基准测试,因为性能对我的项目很重要-以下是我的发现(平均结果为1000x,排序字段有cca 300个元素,键大小为3-50个字符):

    • 2.01秒。。。带有匿名创建_函数的uksort(按cojam)
    • 0.28秒。。。数组_multisort(由Gumbo提供)
    • 2.69秒。。。带有非匿名函数的uksort(由Colin Herbert编写)-让我感到惊讶
    • 0.15秒。。。简单foreach+arsort
    有时,简单的foreach仍然获胜。
    显然,使用动态PHP功能会带来一些性能损失。

    根据长度排序键时的一个限制是:等长键不会重新排序。假设我们需要按长度按降序排列键

    $arr = array(
        "foo 0" => "apple",
        "foo 1" => "ball",
        "foo 2 foo 0 foo 0" => "cat",
        "foo 2 foo 0 foo 1 foo 0" => "dog",
        "foo 2 foo 0 foo 1 foo 1" => "elephant",
        "foo 2 foo 1 foo 0" => "fish",
        "foo 2 foo 1 foo 1" => "giraffe"
    );
    
    debug($arr, "before sort");
    $arrBad = $arr;
    sortKeysDescBAD($arrBad);
    debug($arrBad, "after BAD sort");
    sortKeysDescGOOD($arr);
    debug($arr, "after GOOD sort 2");
    
    function sortKeysDescBAD(&$arrNew) {
        $arrKeysLength = array_map('strlen', array_keys($arrNew));
        array_multisort($arrKeysLength, SORT_DESC, $arrNew);
        //return max($arrKeysLength);
    }
    
    function sortKeysDescGOOD(&$arrNew) {
        uksort($arrNew, function($a, $b) {
            $lenA = strlen($a); $lenB = strlen($b);
            if($lenA == $lenB) {
                // If equal length, sort again by descending
                $arrOrig = array($a, $b);
                $arrSort = $arrOrig;
                rsort($arrSort);
                if($arrOrig[0] !== $arrSort[0]) return 1;
            } else {
                // If not equal length, simple
                return $lenB - $lenA;
            }
        });
    }
    
    function debug($arr, $title = "") {
        if($title !== "") echo "<br/><strong>{$title}</strong><br/>";
        echo "<pre>"; print_r($arr); echo "</pre><hr/>";
    }
    

    注意两种排序方法中的
    elephant
    dog
    的顺序,例如(或其他)。第二种方法看起来更好。可能有更简单的方法来解决这个问题,但希望这对某人有所帮助……

    下面的代码使用lambda函数按键的字符串长度,然后按区分大小写的键本身,按升序对PHP哈希数组进行排序:

    uksort($yourArray, function ($b, $a) { 
       return (strlen($a) == strlen($b) ? strcmp($a, $b) : strlen($a) - strlen($b));
    });
    
    此代码按相反顺序执行相同操作:

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

    在PHP7+中,您可以将
    uksort()
    与spaceship操作符和匿名函数一起使用,如下所示:

    $nametocode['reallylongname']='12';
    $nametocode['name']='17';
    $nametocode['shortname']='10';
    $nametocode['mediumname']='11';
    
    uksort($nametocode, function($a, $b) {
       return strlen($a) - strlen($b);
    });
    
    array_reverse($nametocode, true);
    
    Array
    (
       [reallylongname] => 12
       [mediumname] => 11
       [shortname] => 10
       [name] => 17
    )
    
    uksort($array,function($a,$b){
    返回strlen($b)strlen($a);
    });
    
    要绝对使用uksort您可以这样做:

    $nametocode['reallylongname']='12';
    $nametocode['name']='17';
    $nametocode['shortname']='10';
    $nametocode['mediumname']='11';
    
    uksort($nametocode, function($a, $b) {
       return strlen($a) - strlen($b);
    });
    
    array_reverse($nametocode, true);
    
    Array
    (
       [reallylongname] => 12
       [mediumname] => 11
       [shortname] => 10
       [name] => 17
    )
    
    输出:


    我已经测试了这段代码。

    出于好奇,这段代码是否比
    uksort()
    有性能优势?@thetaiko:不,我不这么认为。但你必须要有个人资料才能确定。主要的区别是没有自定义的比较函数,因为需要比较键值来区分顺序。我喜欢这个函数,因为它很容易将其转换为一行
    $nametocode['reallylongname']='12';
    $nametocode['name']='17';
    $nametocode['shortname']='10';
    $nametocode['mediumname']='11';
    
    uksort($nametocode, function($a, $b) {
       return strlen($a) - strlen($b);
    });
    
    array_reverse($nametocode, true);
    
    Array
    (
       [reallylongname] => 12
       [mediumname] => 11
       [shortname] => 10
       [name] => 17
    )