[英]PHP sort sub array by count of values then by sub array key
What's the easiest way to sort a multi dimensional array. 对多维数组进行排序的最简单方法是什么。 I need to sort it so the output is displayed with the highest count of values on the sub arrays then the sorted alphabetically by the key of the sub arrays:
我需要对它进行排序,以便在子数组上显示具有最高值计数的输出,然后按子数组的键按字母顺序排序:
So something like this: 所以像这样:
MyArray(
subarray4('val1')
subarray2('val1')
subarray3('val1', 'val2', 'val3')
subarray1('val1', 'val2', 'val3')
)
Would look more like this: 看起来会像这样:
MyArray(
subarray1('val1', 'val2', 'val3')
subarray3('val1', 'val2', 'val3')
subarray2('val1')
subarray4('val1')
)
$array = array(
array('val1'),
array('val1'),
array('val1', 'val2', 'val3'),
array('val1', 'val2', 'val3'),
);
function sortByCount($a, $b) {
$a = count($a);
$b = count($b);
if($a == $b) {
return 0;
}
return ($a > $b) ? -1 : 1;
}
uasort($array, 'sortByCount');
Two steps here, first sort array according to subarray count, then loop through array sorting each subarray "alphanumerically". 这里有两个步骤,首先根据子数组计数对数组进行排序,然后循环遍历数组以字母数字方式对每个子数组进行排序。
$myArray = array(
array('val1', 'val2'),
array('val3'),
array('val7', 'val6', 'val5', 'val4'),
array('val8', 'val9', 'val10'),
);
// sort primary array by subarray count
uasort($myArray, function ($a, $b) {
$a = count($a);
$b = count($b);
return ($a == $b) ? 0 : (($a > $b) ? -1 : 1);
});
// now sort each subarray alphanumerically
foreach ( $myArray as $key => $arr ) {
natsort($myArray[$key]); // letters - alpha, numbers - numeric
// note: ignoring $arr because sorting it does not affect $myArray
}
print '<pre>';
print_r($myArray);
print '</pre>';
Output: 输出:
Array
(
[2] => Array
(
[3] => val4
[2] => val5
[1] => val6
[0] => val7
)
[3] => Array
(
[0] => val8
[1] => val9
[2] => val10
)
[0] => Array
(
[0] => val1
[1] => val2
)
[1] => Array
(
[0] => val3
)
)
The uasort
sorting algorithm is cut and paste from here: Sorting array by count of subarray 从这里剪切并粘贴
uasort
排序算法: 按子数组计数对数组进行排序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.