Ordenar un array asociativo o de objetos por un campo en php

 

Hola a todos:

Hoy  os traigo una función en php que puede ser de gran utilidad a la hora de ordenar un array asociativo o un array con objetos.

Por ejemplo vamos a imaginar que tenemos un array de usuarios donde tenemos un campo con el id de usuario, otro con el nombre y otro que contiene la profesión del usuario.

Por ejemplo vamos a crear un   array con este formato:

$arrUsuarios=array
(
 array (
     "id" => 1,
     "nombre" => "Eduardo",
     "profesion" => "Programador"
 ),
 array (
     "id" => 2,
     "nombre" => "Manuel",
     "profesion" => "Dentista"
 ),
 array (
     "id" => 3,
     "nombre" => "Fernando",
     "profesion" => "Fontanero"
 ),
 array (
    "id" => 4,
    "nombre" => "Antonio",
    "profesion" => "Abogado"
 ),
 array (
    "id" => 5,
    "nombre" => "Pascual",
    "profesion" => "Frutero"
 ),
);

Si mostranos el contenido del array  con <?php print_r($arrUsuarios) ?> obtendremos algo parecido a esto:

Array
(
    [0] => Array
        (
            [id] => 1
            [nombre] => Eduardo
            [profesion] => Programador
        )

    [1] => Array
        (
            [id] => 2
            [nombre] => Manuel
            [profesion] => Dentista
        )

    [2] => Array
        (
            [id] => 3
            [nombre] => Fernando
            [profesion] => Fontanero
        )

    [3] => Array
        (
            [id] => 4
            [nombre] => Antonio
            [profesion] => Abogado
        )

    [4] => Array
        (
            [id] => 5
            [nombre] => Pascual
            [profesion] => Frutero
        )

)

Ahora vamos a imaginar que nos interesa ordenar este array por el nombre del usuario en orden alfabético.

Para conseguir esto vamos a crear una pequeña función que nos ayudará a conseguir este propósito:

function array_sort_by(&$arrIni, $col, $order = SORT_ASC)
{
    $arrAux = array();
    foreach ($arrIni as $key=> $row)
    {
        $arrAux[$key] = is_object($row) ? $arrAux[$key] = $row->$col : $row[$col];
        $arrAux[$key] = strtolower($arrAux[$key]);
    }
    array_multisort($arrAux, $order, $arrIni);
}

El primer parámetro el es el array que queremos ordenar.

El segundo parámetro es el campo por el cual queremos ordenar el array.

El tercer parámetro es opcional e indica si se ordenara en orden ascendente o descendente, por defecto ascendente.

Ahora vamos a aplicar esta función a nuestro array y mostrar el resultado.

<?php
array_sort_by($arrUsuarios, 'nombre', $order = SORT_ASC);
?>
<pre><?php print_r($arrUsuarios); ?></pre>

Como podemos observar ahora obtenemos el array ordenado alfabéticamente por el nombre del usuario:

Array
(
    [0] => Array
        (
            [id] => 4
            [nombre] => Antonio
            [profesion] => Abogado
        )

    [1] => Array
        (
            [id] => 1
            [nombre] => Eduardo
            [profesion] => Programador
        )

    [2] => Array
        (
            [id] => 3
            [nombre] => Fernando
            [profesion] => Fontanero
        )

    [3] => Array
        (
            [id] => 2
            [nombre] => Manuel
            [profesion] => Dentista
        )

    [4] => Array
        (
            [id] => 5
            [nombre] => Pascual
            [profesion] => Frutero
        )

)

Esta función en válida también para ordenar array de objetos extraidos por ejemplo de la base de datos.

Espero que os sea útil. 🙂

Un saludo, y si aún no lo has hecho no olvides suscribirte a mi blog para no perderte los próximos posts  :-),

También puedes seguirme en Twitter en ‎@revigames y no olvides que me ayudas mucho si compartes este post en las redes sociales.

7 comentarios en “Ordenar un array asociativo o de objetos por un campo en php

    1. Funciona perfectamente, lo que te pasará es que si la has incluido como función, en el ejemplo falta el return.
      Añade al final:
      return $arrIni;
      y ya tendras el array donde lo haya llamado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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