PHP数组多重sorting – 按值然后按键?

我有一个数字值的string键数组,用于每个标签的出现次数的标签列表,因此:

$arrTags['mango'] = 2; $arrTags['orange'] = 4; $arrTags['apple'] = 2; $arrTags['banana'] = 3; 

这是这样,我可以显示标签列表下降发生顺序,因此:

 orange (4) banana (3) mango (2) apple (2) 

我可以使用arsort来反向sorting的值,这是辉煌的,但我也想要任何具有相同数值的标签按字母顺序sorting,所以最终的结果可以是:

 orange (4) banana (3) apple (2) mango (2) 

有没有办法我可以做到这一点? 我猜测, usort可能是要走的路,但我看在php.net上的例子,我的眼睛釉了! 非常感谢!!!

看看例子#3: http : //php.net/manual/en/function.array-multisort.php

你需要创build两个数组作为索引。 一个由原始数组的键和另一个原始数组的值组成。

然后使用multisort按文本值(原始数组的键)和数值(原始数组的值)进行sorting。

正如Scott Saunders在David的解决scheme中提到的一样,可以使用array_keys()和array_values()函数来摆脱循环。 事实上,你可以在一行代码中解决这个问题:

 array_multisort(array_values($arrTags), SORT_DESC, array_keys($arrTags), SORT_ASC, $arrTags); 

解决了

经过一番小小的实验,我发现array_multisort很好地实现了这个技巧:

 $tag = array(); $num = array(); foreach($arrTags as $key => $value){ $tag[] = $key; $num[] = $value; } array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags); 

🙂

以前提出的解决scheme似乎是合乎逻辑的,但它只是不起作用:

 ksort($arrTags); arsort($arrTags); 

完整的PHP代码来实现问题sorting,将是:

 $k = array_keys($arrTags); $v = array_values($arrTags); array_multisort($k, SORT_ASC, $v, SORT_DESC); $arrTags = array_combine($k, $v); 

请注意,array_multisort()使用用户input的引用,因此您必须使用两个临时variables($ k和$ v)来提供内容作为用户input。 这样array_multisort()可以改变内容。 稍后,通过array_combine()重buildsorting后的数组。

我已经构build了一个可重用的函数来完成这个任务:

 <?php /** * Sort a multi-dimensional array by key, then by value. * * @param array Array to be sorted * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING * @return void * @example The following array will be reordered: * $a = array( * 'd' => 4, * 'c' => 2, * 'a' => 3, * 'b' => 1, * 'e' => 2, * 'g' => 2, * 'f' => 2, * ); * SortArrayByKeyThanValue($a); # reorder array to: array( * 'b' => 1, * 'c' => 2, * 'e' => 2, * 'f' => 2, * 'g' => 2, * 'a' => 3, * 'd' => 4, * ); * @author Sijmen Ruwhof <sijmen(a)secundity.com> * @copyright 2011, Secundity */ function SortArrayByKeyThanValue (&$pArray, $pSortMethodForKey = SORT_ASC, $pSortMethodForValue = SORT_ASC) { # check user input: sorting is not necessary if (count($pArray) < 2) return; # define $k and $v as array_multisort() needs real variables, as user input is put by reference $k = array_keys ($pArray); $v = array_values($pArray); array_multisort( $v, $pSortMethodForValue, $k, $pSortMethodForKey ); $pArray = array_combine($k, $v); } ?> 

SlappyTheFish是正确的re:使用array_multisort与ksort,arsort

在David的示例ksort中,arsort工作正常,但是如果键的string值包含除字母字符以外的其他字符,则sorting可能无法正常工作。

例如:

 $arrTags['banana'] = 3; $arrTags['mango'] = 2; $arrTags['apple1'] = 2; $arrTags['orange'] = 4; $arrTags['almond1'] = 2; ksort($arrTags); arsort($arrTags); print_r($arrTags); 

收益:

 Array ( [orange] => 4 [banana] => 3 [apple1] => 2 [mango] => 2 [almond1] => 2 ) 

然而使用:

 $arrTags['banana'] = 3; $arrTags['mango'] = 2; $arrTags['apple1'] = 2; $arrTags['orange'] = 4; $arrTags['almond1'] = 2; $tag = array(); $num = array(); foreach($arrTags as $key => $value){ $tag[] = $key; $num[] = $value; } array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags); print_r($arrTags); 

收益:

 Array ( [orange] => 4 [banana] => 3 [almond1] => 2 [apple1] => 2 [mango] => 2 ) 

我还没有尝试过,但你有没有尝试按键升序sorting,然后sorting值降序?

看起来,如果他们已经是相同的,大多数人不会移动元素。

您可以创build一个函数来创build一个空的数组,并根据比较顺序插入它们。

你在想太复杂:

 ksort($arrTags); arsort($arrTags); 

现在你的数组按你想要的那样sorting。

 //preserve arrays keys for later use $ar1= array_keys($your_array); //preserve array's values for later use $ar2= array_values($your_array); //perform sorting by value and then by key array_multisort($ar2, SORT_DESC, $ar1, SORT_DESC); //combine sorted values and keys arrays to new array $sorted_array = array_combine($ar1, $ar2); 

一定是好的。