2010-10-26 8 views
20

que tiene una matriz:matriz multidimensional Ordenar por llave específica

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 quiero ordenar por la clave display_name. Actualmente lo imprimo de esta manera:

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

¿Cómo puedo hacer esto?

Respuesta

34

que usaría usort() - http://php.net/usort

Mi sugerencia sería:

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

    usort($blogusers, "cmp"); 

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

usort() es el camino a seguir para asegurarse. ¿Es strcmp la función correcta si se quiere ordenar, por ejemplo, un flotador? Mi suposición sería que las funciones de los comparadores por separado según el tipo podrían ser una buena idea ... – jsh

11

Ver 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

Tome un vistazo a siguiente artículo. Describe cómo usar usort() y también describe cómo usar create_function() para que pueda usar una sola función para ordenar en diferentes campos (con la dirección requerida asc o desc).

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

1

Su gama se ve como el resultado de una consulta de base de datos. Si este es un caso, deje que la base de datos haga la clasificación: simplemente añada ORDER BY display_name a la consulta.

6

que tiene hallazgo respuesta 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; 
} 

Y ahora llaman a esta función mediante la clave de la matriz específica.

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

Y si una especie de asc/desc acaba de añadir un argumento,

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