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';
我希望他们按这个顺序
非常感谢看一看。您可以使用用户定义的键排序函数作为
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
显然,使用动态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
)