2009-12-22 46 views
2

我在做什麼是這樣的:從DB排序一個數組的數值,而無需重新索引(PHP)

  • 我得到的ID值(數值)的列表,並將其存儲到一個數組(1 ,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); 

有個聲音告訴我,有接近這更好的方法?

回答

7

嘗試asort而不是array_multisort,因爲它保持原始索引關聯。

+0

謝謝...這很簡單,但有沒有簡單的方法來排序它在降序列表中?我最初使用multisort是因爲這個。 – 2009-12-22 21:19:47

+2

@ transient-jet-lag:您可以使用'arsort'('r' = reverse)或在'asort'之後使用'array_reverse'。 – Gumbo 2009-12-22 21:22:21

2

從你的第一句話猜測:

我從DB ID值(數值)的列表,並將其存儲到一個數組(1,2,2,...)

也許你可以做排序,而查詢,像這樣:

SELECT id, COUNT(id) AS quantity FROM table GROUP BY id ORDER BY quantity DESC 
+0

嘿,謝謝。你走了,我總是想念最明顯的事情。 – 2009-12-22 21:21:06

+0

是的,你做了,但對問題的詳細背景是下一個最好的事情:) – chelmertz 2009-12-22 22:47:01

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

+0

對於正確的SQL語法請參見http://www.techonthenet。com/sql/order%5Fby.php ;-) – Gumbo 2009-12-22 22:29:40

+0

你是可靠的,組合需要按順序排列。我怎麼能錯過? ;) – 2009-12-22 23:59:13

0

正如其他人所說,如果你可以從數據庫中獲得數據,那麼它可能會更好。如果你想用PHP來做並且需要顛倒的順序,使用[arsort][1]

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