我正在做的是:
array_count_values
计算重复项。此输出([1] => 1,[2] => 2,...)array_keys($array)
来获取计数排序列表中的ID。我曾经使用array_multisort
来表示类似的功能,但在这种情况下,键是字符串('a'=> 2)。现在的问题是我使用数字键和多重键将键重新索引为1,2,3,因为持有计数值的键是数字ID。这当然会破坏目的,因为我无法识别任何东西..
无论如何,这就是我现在正在做的事情:
$array = array(3, 1, 2, 3, 2, 3);
// count the IDs [0]=>3, [1]=>1, [2]=>2
$count = array_count_values($array);
// sort and screw up the id's: [0]=>3 [1]=>1 [2]=>2
array_multisort($count);
有些东西告诉我,有更好的方法来解决这个问题吗?
答案 0 :(得分:7)
尝试使用asort
代替array_multisort
,因为它维护原始索引关联。
答案 1 :(得分:2)
从第一句话猜测:
我从数据库中获取ID值列表(数字)并将其存储到数组中(1,2,2,...)
也许你可以在查询时进行排序,如下所示:
SELECT id, COUNT(id) AS quantity FROM table GROUP BY id ORDER BY quantity DESC
答案 2 :(得分:1)
为什么你需要用php做到这一点?更改SQL语句以获得正确的结果。
之类的东西select ID, count(another_col) as occurrence
from table
group by ID
sort by occurrence
有关正确的SQL语法,请参阅http://www.techonthenet.com/sql/group_by.php
编辑:ups错过了排序标准。它必须是出现而不是ID
答案 3 :(得分:0)
正如其他人提到的,如果您可以从数据库中获取数据,那可能会更好。如果您想在PHP中执行此操作并需要颠倒顺序,请使用[arsort][1]
。
答案 4 :(得分:0)
有一些有效的用例,您可能无法在查询中对结果集进行预排序,并且需要使用array_multisort。下面是一个示例,说明如何在保持原始密钥关联的同时这样做。
// Let's say your data is a hash lookup where the key is important.
$user_ids = array_keys($users);
// You want to sort by username so copy those values.
$usernames = array_column($users, 'username');
// Now sort your arrays.
array_multisort($usernames, SORT_ASC, $user_ids, $users);
// Simply recombine your keys and values.
$users = array_combine($user_ids, $users);