2009-07-25 92 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种元素..