2010-08-18 5 views
1

J'ai quelque chose comme ceci:Tableau de tri d'objets PHP selon certains critères?

$i = 0; 

foreach($tracks['results'] as $track){ 
    $trackName[$i] = $track['name']; 
    $trackPlaycount[$track['name']] = $track['playcount']; 
    $trackPercent[$track['name']] = $track['percent']; 
    $i++; 
} 

$this->trackName = $trackName; 
$this->trackPlaycount = $trackPlaycount; 
$this->trackPercent = $trackPercent; 

comment pourrais-je trier ces objets par Nombre de lectures? D'après ce que j'ai lu jusqu'à présent, je comprends que je devrais probablement créer une fonction de comparaison et ensuite le faire fonctionner avec usort(), n'est-ce pas? Mais je ne suis pas tout à fait sûr de savoir comment réaliser que ...

merci




modifier: ok, maintenant je l'ai comme ceci:

public function firstmethod(){ 
    // there are some more parameters here of course 
    // but they worked before, not important for the problem 
    $i = 0; 
    foreach($tracks['results'] as $track){ 
     $trackName[$i] = $track['name']; 
     $trackPlaycount[$track['name']] = $track['playcount']; 
     $trackPercent[$track['name']] = $track['percent']; 
     // this part is new 
     $tracksArray[$i] = array(
      'name' => $trackName[$i], 
      'playcount' => $trackPlaycount[$track['name']], 
      'percentage' => $trackPercent[$track['name']] 
     ); 
     $i++; 
    } 

    usort($tracksArray, array($this, 'sortByCount')); 

    $i = 0; 
    // this is to put the new sorted array into the old variables? 
    foreach($tracksArray as $temp){ 
     $trackName[$i] = $temp['name']; 
     $trackPlaycount[$trackName[$i]] = $temp['playcount']; 
     $trackPercent[$trackName[$i]] = $temp['percentage']; 
     $i++; 
    } 

    $this->trackName = $trackName; 
    $this->trackPlaycount = $trackPlaycount; 
    $this->trackPercent = $trackPercent; 
} 


public function sortByCount($a, $b){ 
    if($a["playcount"] == $b["playcount"]) { 
     return 0; 
    } 
    return ($a["playcount"] < $b["playcount"]) ? -1 : 1; 
} 

cela fonctionne maintenant ... merci tout le monde

+0

Modifié ma réponse donc il inclut le tri par champs entiers si cela vous donnait le problème, j'espère que ça aide – edorian

Répondre

7

exemple usort:

Dans la fonction personnalisée vous accédez simplement la clé du tableau que vous aimez comme ceci:

?php 
$people = array(
    array('id' => 1, 'name' => 'John', 'age' => 12), 
    array('id' => 2, 'name' => 'Mary', 'age' => 14), 
    array('id' => 3, 'name' => 'Aaaaaadam', 'age' => 15) 
); 

usort($people, "sortByName"); 
var_dump($people); 
usort($people, "sortByAge"); 
var_dump($people); 

function sortByName($a, $b) { 
    return strcmp($a["name"], $b["name"]); 
} 

function sortByAge($a, $b) { // or playcount or whatever 
    if($a["age"] == $b["age"]) { 
     return 0; 
    } 
    return ($a["age"] < $b["age"]) ? -1 : 1; 
} 

imprime le tableau trié (seulement collé un il est donc ne pas avoir à long, autre sortie en conséquence triés par âge)

array(3) { 
    [0]=> 
    array(3) { 
    ["id"]=> 
    int(3) 
    ["name"]=> 
    string(9) "Aaaaaadam" 
    ["age"]=> 
    int(15) 
    } 
    [1]=> 
    array(3) { 
    ["id"]=> 
    int(1) 
    ["name"]=> 
    string(4) "John" 
    ["age"]=> 
    int(12) 
    } 
    [2]=> 
    array(3) { 
    ["id"]=> 
    int(2) 
    ["name"]=> 
    string(4) "Mary" 
    ["age"]=> 
    int(14) 
    } 
} 
+0

alors, je devrais d'abord peupler ce tableau de tableaux, dans ma boucle et ensuite le trier avec une fonction? et une chose de plus ... puisque cela devrait être fait à l'intérieur d'une classe, puis-je faire de cette sorte une fonction privée et l'utiliser comme usort ($ people, $ this-> sortByAge); ou ce genre d'approche ne fonctionnera pas? – pootzko

+1

ce type d'approche fonctionnera, sauf le passage des méthodes d'instance comme les callbacks sont fait comme 'array ($ this," sortByAge ")', ou pour les méthodes statiques comme 'array (" ClassName "," sortByAge ")'. – gnud

+0

Merci pour le rappel avec l'exemple de classes @gnud, +1 – edorian

5

Vous pouvez également utiliser un SplMaxHeap pour cela. L'emprunt @edorian's $people array, vous pouvez faire

class SortByAge extends SplMaxHeap 
{ 
    function compare($a, $b) 
    { 
     return $a['age'] - $b['age']; 
    } 
} 

$sort = new SortByAge; 
foreach($people as $person) { 
    $sort->insert($person); 
} 

print_r(iterator_to_array($sort)); 

Cela devrait perform somewhat better que usort.

+0

merci je suis intéressé à regarder plus dans cela. – Chris