Cómo ordenar un array multidimensional en PHP

La estructura de datos más utilizada en PHP es, por lejos, el arreglo.

Esto se debe a que la implementación de ellos es extremadamente flexible.

Un problema común que nos encontramos es el ordenarlos.

Cuando los arreglos son de una única dimensión no hay mucho problema, basta una función como sort, pero cuando el arreglo es una matriz las cosas son un poco más complejas ya que pueden existir diferentes criterios de filtro.

Por ejemplo, si tu arreglo se ve así:

[
 [
   'name' => 'Juan',
  'age' => 40,
 ],
   'name' => 'Alberto',
   'age' => 60,
 ],
]

El resultado será diferente si queremos ordenar por age que por name

Claro que podrías usar una solución diseñada por tí mismo basada en un par de ciclos anidados y seguramente funcionaría, pero sería trabajar de más.

Ordenar un arreglo PHP según un criterio propio

Una función muy útil para resolver este tipo de situación es usort.

Esta función recibe un arreglo como parámetro y una función que se utiliza para comparar cualquier par de elementos entre sí (Lo que se conoce como un callback).

De este modo, para el ejemplo anterior podríamos definir dos funciones de comparación:

  1. Por nombre
  2. Por edad
function compareByName(array $elem1, array $elem2) {
    if ( $elem1['name'] > $elem2['name'] ) {
          return 1;
    } elseif ( $elem1['name'] < $elem2['name'] ) {
          return -1;
    } else {
          return 0;
    }
}

function compareByAge(array $elem1, array $elem2) {
    if ( $elem1['age'] > $elem2['age'] ) {
          return 1;
    } elseif ( $elem1['age'] < $elem2['age'] ) {
          return -1;
    } else {
          return 0;
    }
}

Cualquiera de estas podría ser utilizada, según el criterio que necesites, por ejemplo:

usort($people, 'compareByName');

O podríamos usar también una función anónima:

usort($people, function( array $elem1, $elem2 ) {
    if ( $elem1['age'] > $elem2['age'] ) {
          return 1;
    } elseif ( $elem1['age'] < $elem2['age'] ) {
          return -1;
    } else {
          return 0;
    }
});

O, si estás usando php7 o superior:

usort($people, function( array $elem1, $elem2 ) {
    return $elem1['name'] <=> $elem2['name'];
});

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: