2009-04-22 2 views
55

Sortierung habe ich ein Array in diesem Format:ein assoziatives Array in PHP

Array 
(
    [0] => Array 
     (
      [text] => tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 7480000 
      [lastMonthSearchVolume] => 9140000 
     ) 

    [1] => Array 
     (
      [text] => personality tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 165000 
      [lastMonthSearchVolume] => 201000 
     ) 

    [2] => Array 
     (
      [text] => online tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 246000 
      [lastMonthSearchVolume] => 301000 
     ) 

) 

Wie kann ich ein Array in diesem Format sortieren, in absteigender Reihenfolge des avgSearchVolume Feldes? Gibt es dafür eine eingebaute Funktion?

+3

Dies ist nicht ein assoziatives Array ... aber eine Reihe von assoziativen Arrays ;-) –

Antwort

92

Verwenden usort und Ihre eigene Funktion liefert die Bestellung zu tun, zum Beispiel

+0

Und auch lesen http://StackOverflow.com/Questions/8456029/how-does-usort-work#answer-8456055 auch empfohlen – vinrav

+0

ersetzen 'return strcmp ($ a ['key'], $ b ['key']); 'um Strings zu vergleichen –

+0

Danke! Es hat viel Zeit gespart. – Simon

2

helfen Dies könnte: Sorting Arrays of Arrays

+0

Dies ist ein Link nur Antwort, die überhaupt nicht gut ist – Zanshin13

+0

Dies war vor 8 Jahren! – Aziz

+0

Ja! Und trotz der Tatsache, dass die Verbindung noch funktioniert, kann sie jeden Moment ausgehen (oder nicht) :) – Zanshin13

8

Sie werden eine benutzerdefinierte Callback-Funktion zusammen mit usort() verwenden.

function cmp($a, $b) 
{ 
    if ($a['avgSearchVolume'] == $b['avgSearchVolume']) { 
     return 0; 
    } 
    return ($a['avgSearchVolume'] > $b['avgSearchVolume']) ? -1 : 1; 
} 
usort($array, 'cmp'); 
+0

Während das funktioniert, sollte eine Vergleichsfunktion wirklich 0 zurückgeben, wenn zwei verglichene Elemente gleich sind. –

+0

Sie haben Recht Paul - aber da die Sortierreihenfolge im Falle der Gleichheit undefiniert ist, wäre eine bessere Lösung, einen weiteren Vergleich einzuführen, um diese Unsicherheit zu beseitigen. Bearbeitete die Antwort entsprechend. –

18

Bis PHP 5.3 ist dies die beste Funktion zum Sortieren basierend auf Unterschlüsseln, ohne eine neue Funktion für jede Taste zu erstellen.

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) { 
    foreach ($array as $subarray) { 
     $keys[] = $subarray[$subkey]; 
    } 
    array_multisort($keys, $sortType, $array); 
} 
sortBySubkey($arr, 'avgSearchVolume'); 

Mit PHP 5.3 können Sie so etwas machen, gleiche Funktionsaufruf wie jetzt.

function getSortVariable($sortType = SORT_ASC) { 
    switch($sortType) { 
     case SORT_ASC: 
      return function ($a, $b) use ($subkey) { return strcmp($a[$subkey], $b[$subkey]); }; 
    } 
} 

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) { 
    $sortFunction = getSortVariable($sortType); 
    usort($array, $sortFunction($subkey)); 
} 
1

Hier ist eine andere Lösung, Sie können mehrere Optionen für das Sortieren (Siehe den kommentierten Abschnitt des Codes) hinzufügen können

<?php 

$arr=Array(
    Array("text" => "tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 7480000,"lastMonthSearchVolume" => 9140000), 
    Array("text" => "personality tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 165000,"lastMonthSearchVolume"=>201000), 
    Array("text" => "online tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 246000,"lastMonthSearchVolume" =>301000) 
    ); 


$sort = array(); 
foreach($arr as $k=>$v) { 
    $sort['avgSearchVolume'][$k] = $v['avgSearchVolume']; 
    //$sort['text'][$k] = $v['text']; 
} 

array_multisort($sort['avgSearchVolume'], SORT_DESC, $arr); 
//array_multisort($sort['avgSearchVolume'], SORT_DESC, $sort['text'], SORT_ASC,$arr); 

echo "<pre>"; 
print_r($arr); 

?> 

REF: http://php.net/manual/en/function.array-multisort.php

2
function querySort ($first_Array,$second_Array) { 
    return strcasecmp($first_Array['name'],$second_Array['name']); 
} 
echo '<pre>'; 
usort($main, 'querySort'); 

print_r($main); 
die; 
+0

Einige Wörter der Erklärung würden dieses Codebeispiel noch besser machen. – Thom