Ordenar arrays en PHP

Cómo ordenar arrays multidimensionales en PHP con usort y funciones anónimas

Ordenar listas de objetos, arrays asociativas y multidimensionales en PHP nunca fue más fácil. Desde PHP 5.3 se introdujo el concepto de closures o funciones anónimas. Estas permiten la creación de funciones sin nombre y en PHP se suelen usar como parámetro de callback.

*Nota: Si has programado en Ruby, estas funciones son algo parecido a lo que se conoce como blocks. Esta metodología también se suele usar bastante en Javascript.

Veamos un ejemplo:

Si tenemos un listado de arrays

$coleccion = array(
  array(
    "color" => "rojo"
  ),
  array(
    "color" => "blanco"
  ),
  array(
    "color" => "negro"
  ),
);

Lo ordenamos por la clave color alfabéticamente y de forma ascendente.

usort($coleccion, function($a, $b)
 {
  return strcmp($a["color"], $b["color"]);
});

El array ordenado quedará así:

print_r($coleccion);
Array
([0] => Array([color] => blanco)
    [1] => Array(
      [color] => negro
    )
    [2] => Array(
      [color] => rojo
    )
)

Como vemos la función permite pasarle como parámetro otra función.

Visibilidad de variables

Una de las cosas a tener en cuenta al usar funciones anónimas es que se crea un ámbito único para ejecutar el código de la función, es decir, las variables que se definan fuera de esta función no son accesibles. Para utilizar una variable externa podemos usar la instrucción use, por ejemplo:

$otra_variable = 1;

usort($coleccion, function($a, $b) use($otra_variable) {
  if($otra_variable == 1) {
    return strcmp($a["color"], $b["color"]);
  } elseif($otravariable == 2) {
    // ...
  }
});