2010-10-26 13 views
20

Ho un array:sorta di matrice multidimensionale da specifica chiave

Array (
    [0] => stdClass Object (
     [user_id] => 1 
     [ID] => 1 
     [user_login] => admin 
     [display_name] => admin 
     [user_email] => [email protected] 
     [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";} 
    ) 
    [1] => stdClass Object (
     [user_id] => 4 
     [ID] => 4 
     [user_login] => ungtinflytande 
     [display_name] => ungtinflytande 
     [user_email] => [email protected] 
     [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";} 
    ) 
    [2] => stdClass Object (
     [user_id] => 5 
     [ID] => 5 
     [user_login] => inflytandepilot 
     [display_name] => inflytandepilot 
     [user_email] => [email protected] 
     [meta_value] => a:1:{s:6:\"author\";s:1:\"1\";} 
    ) 
    [3] => stdClass Object (
     [user_id] => 11 
     [ID] => 11 
     [user_login] => matsbohman 
     [display_name] => matsbohman 
     [user_email] => [email protected] 
     [meta_value] => a:1:{s:6:\"editor\";s:1:\"1\";} 
    ) 
    [4] => stdClass Object (
     [user_id] => 12 
     [ID] => 12 
     [user_login] => klarakviberg 
     [display_name] => klarakviberg 
     [user_email] => [email protected] 
     [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";} 
    ) 
) 

... che voglio sorta dal tasto display_name. Attualmente lo stampo in questo modo:

foreach ($blogusers as $bloguser) { 
    ... 
} 

Come faccio?

risposta

34

usereste usort() - http://php.net/usort

Il mio suggerimento sarebbe:

function cmp($a, $b) 
    { 
     return strcmp($a->display_name, $b->display_name); 
    } 

    usort($blogusers, "cmp"); 

    foreach ($blogusers as $bloguser) 
    { 
     ... 
+0

usort() è la strada da percorrere per certo. Lo strcmp è la funzione giusta se si volesse ordinare, per esempio, un float? La mia ipotesi sarebbe una funzione di comparatore separata a seconda del tipo potrebbe essere una buona idea ... – jsh

11

Vedi usort: http://php.net/manual/en/function.usort.php

usort($array, "my_cmp"); 

function my_cmp($a, $b) { 
    if ($a->display_name == $b->display_name) { 
    return 0; 
    } 
    return ($a->display_name < $b->display_name) ? -1 : 1; 
} 
0

Date un'occhiata a seguente articolo. Descrive come utilizzare usort() e descrive anche come utilizzare create_function() in modo che sia possibile utilizzare la funzione singola per ordinare in campi diversi (con la direzione richiesta asc o desc).

http://phpave.com/sorting-associative-array-specific-key/

1

vostro array si presenta come il risultato di una query di database. Se questo è un caso, lascia che il database faccia l'ordinamento: aggiungi semplicemente ORDER BY display_name alla query.

6

devo risposta ritrovamento a https://joshtronic.com/2013/09/23/sorting-associative-array-specific-key/

function sortBy($field, &$array, $direction = 'asc') 
{ 
    usort($array, create_function('$a, $b', ' 
     $a = $a["' . $field . '"]; 
     $b = $b["' . $field . '"]; 

     if ($a == $b) 
     { 
      return 0; 
     } 

     return ($a ' . ($direction == 'desc' ? '>' : '<') .' $b) ? -1 : 1; 
    ')); 

    return true; 
} 

E ora chiamano questa funzione specifica chiave dell'array.

$newArray = sortBy('display_name', $blogusers); 

E se quelli in asc/disc basta aggiungere un argomento,

sortBy('display_name', $blogusers, 'desc'); 
Problemi correlati