Php 按长度然后按字母顺序对数组排序
我正在尝试一种先按长度,然后按字母顺序对单词进行排序的方法Php 按长度然后按字母顺序对数组排序,php,sorting,Php,Sorting,我正在尝试一种先按长度,然后按字母顺序对单词进行排序的方法 // from $array = ["dog", "cat", "mouse", "elephant", "apple"]; // to $array = ["cat", "dog", "apple", "mouse", "elephant"]; 我见过,但它是用Java编写的,而且,它只处理按长度排序的问题。我尝试过按长度排序,使用答案中提供的代码,然后按字母顺序排序,但它只按字母顺序排序 // from $array = ["d
// from
$array = ["dog", "cat", "mouse", "elephant", "apple"];
// to
$array = ["cat", "dog", "apple", "mouse", "elephant"];
我见过,但它是用Java编写的,而且,它只处理按长度排序的问题。我尝试过按长度排序,使用答案中提供的代码,然后按字母顺序排序,但它只按字母顺序排序
// from
$array = ["dog", "cat", "mouse", "elephant", "apple"];
// to
$array = ["cat", "dog", "apple", "mouse", "elephant"];
如何先按长度排序,然后按字母顺序排序?您可以将这两个条件都放入
usort
比较函数中
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
按多个条件排序的一般策略是为每个条件编写比较表达式,这些条件返回比较函数的适当返回类型(整数、正、负或零,取决于比较结果),并按照所需的排序顺序(例如,第一个长度)对其进行计算,然后按字母顺序
如果一个表达式的计算结果为零,则这两项在该比较中相等,应计算下一个表达式。如果不是,则该表达式的值可以作为比较函数的值返回
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
这里的另一个答案似乎意味着此比较函数不返回大于、小于或等于零的整数。是的 注意:我没有提前发布我的答案,因为@Don't慌张得比我快。不过,我想对他的回答做一些解释(希望这有助于加深理解) 嗯。函数等待来自自定义比较函数的下一步(来自文档): 比较函数必须返回小于、等于或等于的整数 如果第一个参数被认为是 分别小于、等于或大于第二个 好的,将@Don't Panic代码重写到此视图(根据上述条件):
在实践中(根据我的经验),它是通过几个条件对无序的多维数组进行排序。您可以像上面那样使用
usort
。这并不像其他方法那么短,但我认为它更清晰,而且
可以很容易地扩展到其他用例:
$f=函数($s1,$s2){
$n=strlen($s1)strlen($s2);
如果($n!=0){
返回$n;
}
返回$s1$s2;
};
usort($array,$f);
是否可以/是否要修改数组中的值?如果是,那么对数组的每个值进行迭代并在每个值之前写入一个包含值长度的字符串如何?像“03dog”、“03cat”、“04鼠标”、“08大象”、“05苹果”
,然后按值排序?你尝试过什么?所以不是一个“如何做这个”网站,而是一个“什么是我的代码不工作”的网站。向我们展示您的尝试,以便我们提供指导。并查看php文档:@AlienHoboken并非所有问题都必须是调试问题,幸运的是。@不要担心,这些问题都是离题的,尤其是当php@AlienHoboken中已经存在大量关于如何对数组排序的问题时,我尝试做的不仅仅是按字母顺序排序,如果我想这样做,我可以使用基本排序,我不需要问。
usort($array, function(ITEM_1, ITEM_2) {
// SORT_ORDER_CONDITION_#1
if (COMPARING_1_EQUALS){
// SORT_ORDER_CONDITION_#2
if (COMPARING_2_EQUALS){ // If last con - return 0, else - going "deeper" ( to next in order)
//...
// SORT_ORDER_CONDITION_#N
if (COMPARING_N_EQUALS) // last -> equals -> return 0;
return 0;
return ( COMPARING_N_NOT_EQUALS) ? -1 : 1;
//...
}
return ( COMPARING_2_NOT_EQUALS) ? -1 : 1;
}else{
return ( COMPARING_1_NOT_EQUALS ) ? - 1 : 1;
}
});