Dav*_*vid 23 php arrays sorting
我有一个带有数值的字符串键数组,用于标记列表中,每个标记的出现次数如下:
$arrTags['mango'] = 2;
$arrTags['orange'] = 4;
$arrTags['apple'] = 2;
$arrTags['banana'] = 3;
Run Code Online (Sandbox Code Playgroud)
这样我就可以按降序出现顺序显示标签列表:
orange (4)
banana (3)
mango (2)
apple (2)
Run Code Online (Sandbox Code Playgroud)
我可以使用arsort来反向排序,但是我也希望任何具有相同数值的标签按字母顺序排序,因此最终结果可以是:
orange (4)
banana (3)
apple (2)
mango (2)
Run Code Online (Sandbox Code Playgroud)
我有办法做到这一点吗?我猜测usort可能是要走的路,但我看看php.net上的例子,我的眼睛茫然!非常感谢!!!
Jon*_*rdt 38
正如Scott Saunders在对David的解决方案的评论中暗示的那样,你可以使用array_keys()和array_values()函数来摆脱循环.实际上,您可以在一行代码中解决这个问题:
array_multisort(array_values($arrTags), SORT_DESC, array_keys($arrTags), SORT_ASC, $arrTags);
Run Code Online (Sandbox Code Playgroud)
Sla*_*ish 15
看一下例子#3:http: //php.net/manual/en/function.array-multisort.php
您需要创建两个数组作为索引; 一个由原始数组的键组成,另一个由原始数组的值组成.
然后使用multisort按文本值(原始数组的键)进行排序,然后使用数值(原始数组的值)进行排序.
Dav*_*vid 14
解决了
经过一些实验,我发现这很有效array_multisort:
$tag = array();
$num = array();
foreach($arrTags as $key => $value){
$tag[] = $key;
$num[] = $value;
}
array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags);
Run Code Online (Sandbox Code Playgroud)
:)
之前提出的解决方案似乎合乎逻辑,但它只是起作用:
ksort($arrTags);
arsort($arrTags);
Run Code Online (Sandbox Code Playgroud)
完成问题排序的完整PHP代码将是:
$k = array_keys($arrTags);
$v = array_values($arrTags);
array_multisort($k, SORT_ASC, $v, SORT_DESC);
$arrTags = array_combine($k, $v);
Run Code Online (Sandbox Code Playgroud)
请注意,array_multisort()使用对用户输入的引用,因此您必须使用两个临时变量($ k和$ v)来提供内容作为用户输入.这样,array_multisort()可以更改内容.稍后,通过array_combine()重建已排序的数组.
我已经构建了一个可重用的函数来完成这个任务:
<?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);
}
?>
Run Code Online (Sandbox Code Playgroud)