2009-04-22 24 views
55

Ho un array in questo formato:Ordinamento di un array associativo 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 
     ) 

) 

Come posso ordinare un array in quel formato, in ordine decrescente del campo avgSearchVolume? C'è una funzione integrata per questo?

+3

Questo non è un array associativo ... ma una serie di array associativi ;-) –

risposta

92

Usa usort e fornire la propria funzione per fare l'ordinamento, ad esempio,

function cmp($a, $b) 
{ 
    return $b['avgSearchVolume'] - $a['avgSearchVolume']; 
} 

usort($array, "cmp"); 
+0

E leggere anche http://stackoverflow.com/questions/8456029/how-does-usort-work#answer-8456055 anche consigliato – vinrav

+0

Sostituire 'return strcmp ($ a ['chiave'], $ b ['chiave']); 'per confrontare le stringhe –

+0

Grazie! Ha risparmiato molto tempo. – Simon

2

Questo potrebbe aiutare: Sorting Arrays of Arrays

+0

Questa è una risposta solo per il collegamento, che non è affatto buona – Zanshin13

+0

Questo era 8 anni fa! – Aziz

+0

Sì! E nonostante il fatto che il collegamento sia ancora funzionante, può andare in qualsiasi momento (o meno) :) – Zanshin13

8

Dovrete usare una funzione di callback personalizzata con usort().

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

Mentre funzionerà, una funzione di confronto dovrebbe davvero restituire 0 se due elementi confrontati sono uguali. –

+0

Hai ragione Paul - ma poiché l'ordinamento non è definito in caso di parità, una soluzione migliore sarebbe introdurre un altro confronto per rimuovere questa incertezza. Modificato la risposta di conseguenza. –

18

Fino a PHP 5.3 questa è la funzione migliore per l'ordinamento in base alle sottochiavi senza creare una nuova funzione per ogni chiave.

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

Con PHP 5.3 è possibile creare qualcosa come questa, stessa funzione chiamata come ora.

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

Ecco un'altra soluzione, è possibile aggiungere più opzioni di ordinamento (Vedere la sezione commentata del codice)

<?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

Alcune parole di spiegazione renderebbero questo esempio di codice ancora migliore. – Thom

Problemi correlati