在最大出现次数上排序数组

时间:2014-11-15 18:41:36

标签: php arrays sorting

我是php的新手,我觉得这种语言有一些非常好的数组排序功能

下面有一个输入数组,其中包含书籍,读者和价格

$input[]=array("Harrypotter","John",50);
$input[]=array("Twilight","John",60);
$input[]=array("Harrypotter","Jack",80);
$input[]=array("Gonegirl","marion",90);
$input[]=array("Gonegirl","test",90);
$input[]=array("Gonegirl","John",90);
$input[]=array("Gonegirl","eliza",90);

我想在第一个字段上对数组进行排序,使得重复次数较多的书应该先出现,预期的O / p就是这样的

$input[]=array("Gonegirl","marion",90);
$input[]=array("Gonegirl","test",90);
$input[]=array("Gonegirl","John",90);
$input[]=array("Gonegirl","eliza",90);
$input[]=array("Harrypotter","Jack",80);
$input[]=array("Harrypotter","John",50);
$input[]=array("Twilight","John",60);

我能够复制单独数组中的第一个字段并使用 array_count_values 来获取事件,并且我能够通过 array_multi_sort 获得预期输出但是它只按第一个字段的字母顺序排序。

任何有效的解决方案都会有所帮助!

3 个答案:

答案 0 :(得分:1)

这应该适合你:

<?php

    $input = array();

    $input[]=array("Harrypotter","John",50);
    $input[]=array("Twilight","John",60);
    $input[]=array("Harrypotter","Jack",80);
    $input[]=array("Gonegirl","marion",90);
    $input[]=array("Gonegirl","test",90);
    $input[]=array("Gonegirl","John",90);
    $input[]=array("Gonegirl","eliza",90);

    function cmp($a, $b) {
        return strcmp($a[0], $b[0]);
    }

    usort($input, "cmp");

    print_r($input);

?>

答案 1 :(得分:1)

首先必须建立每个值出现频率的计数,然后你可以编写一个按这些值排序的比较函数:

$counts = array_count_values(array_map('current', $input));
usort($input, function (array $a, array $b) use ($counts) {
    return $counts[$b[0]] - $counts[$a[0]];
});

答案 2 :(得分:0)

array_multisort(array_map('count', $input), SORT_DESC, $input);

PS:来自PHP Sort a multidimensional array by number of items

<强>更新

array_multisort(array_map(function ($fld) {return $fld[0];}, $input), SORT_ASC, $input);