2009-07-25 10 views
2

mon tableau est configuré comme suit:obtenir seulement 5 éléments de tableau

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 

Je veux obtenir/filtrer les 5 éléments avec de poids »bigges. Y at-il une fonction php pour faire cela?

PS. Mon idée était d'utiliser foreach

Répondre

0

Pour autant que je sache, il n'y en a pas.

Vous pouvez utiliser un heap pour cela, mais pour seulement 5 éléments que je ne suis pas sûr que c'est plus rapide que simplement stocker le top 5.

7

Trier le tableau par la valeur de poids dans l'ordre décroissant, puis obtenir les cinq premières valeurs:

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

usort ne préserve pas les clés du tableau- – Greg

2

Vous feriez mieux utilisez uasort avec un rappel qui compare le « poids 'index des valeurs passées, puis array_slice pour saisir les 5 premiers éléments (ou 5 derniers en fonction de la façon dont vous trier ...)

+0

je ne serais pas trier tout le tableau. Cela a une complexité de O (n * log n), en utilisant un tas ou une simple liste des éléments du top5 c'est à O (k * log n) ou O (k * n) –

0

Je voudrais utiliser array_multisort(), puis saisir les 5 premières valeurs.

array_multisort (poids $, SORT_DESC, étiquette $, SORT_ASC, YOUR_ARRAY $)

Ensuite, il suffit de saisir YOUR_ARRAY $ [0] - YOUR_ARRAY $ [4] ou itérer sur le tableau pour saisir le premier 5

[EDIT] voici un lien vers la fonction ->http://us3.php.net/manual/en/function.array-multisort.php

0

Mon anglais est pas le meilleur, je vais essayer d'expliquer, ce que je avoir besoin. je peux trier le tableau .... mais dans l'exemple ci-dessus j'ai suivantes:

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

Alors ... si je prends les 5 premiers éléments, l'autre 3 avec le poids 2 seront ignorés. Donc, j'ai besoin de tous les 5 éléments avec un poids de 2 .... et donc j'ai un tableau avec 7 articles.

Un autre exemple:

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

Tous les éléments avec weight1 doivent être ignorés, si je reçois 6 éléments dans un nouveau tableau ..

Questions connexes