2010-10-26 6 views
20

spécifique J'ai un tableau:tableau Trier pluridimensionnelle par clé

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\";} 
    ) 
) 

... que je veux trier par la clé display_name. Je l'imprime actuellement comme ceci:

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

Comment est-ce que je fais ceci?

Répondre

34

Vous utilisez usort() - http://php.net/usort

Ma suggestion serait:

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

    usort($blogusers, "cmp"); 

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

usort() est la voie à suivre pour vous. Est-ce que strcmp est la bonne fonction si l'on veut trier, par exemple, un flotteur? Ma conjecture serait fonctions de comparateurs séparés en fonction du type pourrait être une bonne idée ... – jsh

11

Voir 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

Jetez un oeil à l'article suivant. Il décrit comment utiliser usort() et décrit également comment utiliser create_function() afin que vous puissiez utiliser une seule fonction pour trier sur différents champs (avec la direction requise asc ou desc).

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

1

Votre tableau ressemble le résultat d'une requête de base de données. Si c'est le cas, laissez la base de données faire le tri: ajoutez simplement ORDER BY display_name à la requête.

6

J'ai réponse à trouver 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; 
} 

Et maintenant appeler cette fonction par clé du tableau spécifique.

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

Et si tri dans asc/desc Il suffit d'ajouter un argument,

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