2009-07-25 68 views
2

我的數組是設置如下:得到數組只有5個元素

array 
    'testuri/abc' => 
    array 
     'label' => string 'abc' (length=3) 
     'weight' => float 5 
    'testuri/abd' => 
    array 
     'label' => string 'abd' (length=3) 
     'weight' => float 2 
    'testuri/dess' => 
    array 
     'label' => string 'dess' (length=4) 
     'weight' => float 2 
    'testuri/gdm' => 
    array 
     'label' => string 'gdm' (length=3) 
     'weight' => float 2 
    'testuri/abe' => 
    array 
     'label' => string 'abe' (length=3) 
     'weight' => float 2 
    'testuri/esy' => 
    array 
     'label' => string 'esy' (length=3) 
     'weight' => float 2 
    'testuri/rdx' => 
    array 
     'label' => string 'rdx' (length=3) 
     'weight' => float 3 
    'testuri/tfc' => 
    array 
     'label' => string 'tfc' (length=3) 
     'weight' => float 3 

我想/篩選5個元素與bigges「權重」。有沒有一個PHP函數來做到這一點?

PS。我的想法是使用的foreach

回答

0

據我所知沒有。

你可以使用這個heap,但僅在5個元素我不知道這是不是僅僅存儲前5

7

排序數組由權值降序排列,然後得到的第一個五年值:

function cmpByWeight($a, $b) { 
    return $b['weight'] - $a['weight']; 
} 
uasort($array, 'cmpByWeight'); 
$firstFive = array_slice($array, 0, 5); 
+0

usort將不保留陣列鍵 – Greg 2009-07-25 12:59:28

2

你會更好使用uasort與比較「重回調'索引的值,然後array_slice抓住前5個元素(或後5個取決於你排序的方式...)

+0

我不會對整個數組進行排序。這具有O(n * log n)的複雜度,使用一個堆或一個簡單的top5元素列表,它的值爲O(k * log n)或O(k * n) – 2009-07-25 13:05:31

0

我會使用array_multisort(),然後抓住前5個值。

在array_multisort($重量,SORT_DESC,$標籤,SORT_ASC,$ YOUR_ARRAY)

然後,只需抓住$ YOUR_ARRAY [0] - $ YOUR_ARRAY [4]或迭代陣列搶第一5

[編輯]這裏有一個鏈接功能 - >http://us3.php.net/manual/en/function.array-multisort.php

0

我的英語不是最好的快,我會盡量解釋,我什麼需要。我可以對數組進行排序....但在上面的例子中我有以下:如果我搶第一5個元素

1x weight 5 
2x weight 3 
5x weight 2 

所以...,另一3重量2將被忽略。所以我需要所有5個重量爲2的元素....所以我有一個數組有7個項目。

又如:

2x weight 5 
4x weight 2 
7x weight 1 

與重量1所有元素都必須被忽略,所以我得到一個新的陣列6種元素..