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);
一定是好的。