在不重新编制索引的情况下对数组的数值进行排序(PHP)

时间:2009-12-22 21:12:30

标签: php sorting

我正在做的是:

  • 我从数据库中获取ID值列表(数字)并将其存储到数组中(1,2,2,...)
  • 然后我用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);

有些东西告诉我,有更好的方法来解决这个问题吗?

5 个答案:

答案 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);