根据任何值的计数对数组进行排序


Sort array based on count of any value

我有一个看起来像的数组

Array
(
    [0] => Array
        (
            [id] => 39662
            [points] => 24
            [subject] => 112
        )
    [1] => Array
        (
            [id] => 39609
            [points] => 24
            [subject] => 87
        )
    [2] => Array
        (
            [id] => 39610
            [points] => 23
            [subject] => 77
        )
    [3] => Array
        (
            [id] => 39608
            [points] => 23
            [subject] => 87
        )
    [4] => Array
        (
            [id] => 39606
            [points] => 22
            [subject] => 60
        )
    [5] => Array
        (
            [id] => 39604
            [points] => 19
            [subject] => 75
        )
    [6] => Array
        (
            [id] => 39595
            [points] => 18
            [subject] => 60
        )
    [7] => Array
        (
            [id] => 39605
            [points] => 18
            [subject] => 47
        )
    [8] => Array
        (
            [id] => 39650
            [points] => 17
            [subject] => 87
        )
    [9] => Array
        (
            [id] => 39660
            [points] => 17
            [subject] => 55
        )
)

现在我想根据关键主题的计数进行排序。您可以看到subjuet=87有3条记录,subjuet=60有两条记录,所以87的所有三条记录都应该首先显示,在60的这条记录之后,然后显示其他记录。

我尝试了array_multissort,但没有给出预期的结果。

感谢

根据您想要的输出,您只需要array_map()array_multisort()

示例:

<?php
// Test Array
$array = array(
    array('id'=>39662,'points'=>'24','subject'=>112),
    array('id'=>39609,'points'=>'24','subject'=>87),
    array('id'=>39610,'points'=>'23','subject'=>77),
    array('id'=>39608,'points'=>'23','subject'=>87),
    array('id'=>39606,'points'=>'22','subject'=>60),
    array('id'=>39604,'points'=>'19','subject'=>75),
    array('id'=>39595,'points'=>'18','subject'=>60),
    array('id'=>39605,'points'=>'18','subject'=>47),
    array('id'=>39650,'points'=>'17','subject'=>87),
    array('id'=>39660,'points'=>'17','subject'=>55),
  );
$newArr = array(); // initialize the new Array
foreach ($array as $key => $value)
{
    $newArr[$value['subject']][] = $value;
}
array_multisort(array_map('count', $newArr), SORT_DESC, $newArr); // using array_multisort() and Sort as DESC order by using array_map()
echo "<pre>";
print_r($newArr);
?>

结果:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 39609
                    [points] => 24
                    [subject] => 87
                )
            [1] => Array
                (
                    [id] => 39608
                    [points] => 23
                    [subject] => 87
                )
            [2] => Array
                (
                    [id] => 39650
                    [points] => 17
                    [subject] => 87
                )
        )
    [1] => Array
        (
            [0] => Array
                (
                    [id] => 39606
                    [points] => 22
                    [subject] => 60
                )
            [1] => Array
                (
                    [id] => 39595
                    [points] => 18
                    [subject] => 60
                )
        )
    [2] => Array
        (
            [0] => Array
                (
                    [id] => 39604
                    [points] => 19
                    [subject] => 75
                )
        )
    [3] => Array
        (
            [0] => Array
                (
                    [id] => 39605
                    [points] => 18
                    [subject] => 47
                )
        )
    [4] => Array
        (
            [0] => Array
                (
                    [id] => 39610
                    [points] => 23
                    [subject] => 77
                )
        )
    [5] => Array
        (
            [0] => Array
                (
                    [id] => 39660
                    [points] => 17
                    [subject] => 55
                )
        )
    [6] => Array
        (
            [0] => Array
                (
                    [id] => 39662
                    [points] => 24
                    [subject] => 112
                )
        )
)

对于您的案例,请尝试以下方法

$data[] = array('points' => 67, 'subject' => 2);
$data[] = array('points' => 86, 'subject' => 1);
$data[] = array('points' => 85, 'subject' => 6);
$data[] = array('points' => 98, 'subject' => 2);
$data[] = array('points' => 86, 'subject' => 6);
$data[] = array('points' => 67, 'subject' => 7);

// Obtain a list of columns
foreach ($data as $key => $row) {
    $subject[$key] = $row['subject'];
}
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($subject, SORT_DESC, $data);

php手册中我的数组的示例用法。

上述输出为

Array
(
    [0] => Array
        (
            [points] => 67
            [subject] => 7
        )
    [1] => Array
        (
            [points] => 85
            [subject] => 6
        )
    [2] => Array
        (
            [points] => 86
            [subject] => 6
        )
    [3] => Array
        (
            [points] => 67
            [subject] => 2
        )
    [4] => Array
        (
            [points] => 98
            [subject] => 2
        )
    [5] => Array
        (
            [points] => 86
            [subject] => 1
        )
)
function array_sort($array, $key){
    $new_array = array();
    $sortable_array = array();
    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $key) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

       asort($sortable_array);

        }
        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }
    return $new_array;
}
 array_sort($a, 'subjects');

//$a是要对进行排序的数组