En más de una ocasión hemos necesitado ordenar un array en php. De hecho hay funciones nativas que lo hacen, pero debemos recurrir a unas u otras en función de la necesidad más o menos compleja que tengamos.

Esta función ordena de forma ascendente o descente un array bien sea un string o un número.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function ordenar_array()
{
    $n_parametros = func_num_args();
   
    if($n_parametros<3 || $n_parametros%2!=1)
    {
        return false;
    }
    else
    {
        $arg_list = func_get_args();
   
        if (!(is_array($arg_list[0]) && is_array(current($arg_list[0]))))
        {
            return false; // Si el primero no es un array...MALO!
        }
       
        for ($i = 1; $i<$n_parametros; $i++)
        {
            if ($i%2!=0)
            {
                if (!array_key_exists($arg_list[$i], current($arg_list[0])))
                {
                    return false;
                }
            }
            else
            {
                if ($arg_list[$i] != SORT_ASC && $arg_list[$i] != SORT_DESC)
                {
                    return false;
                }
            }
        }
        $array_salida = $arg_list[0];
   
        $a_evaluar = "foreach (\$array_salida as \$fila){\n";
       
        for ($i=1; $i<$n_parametros; $i+=2)
        {
            $a_evaluar .= "  \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
        }
       
        $a_evaluar .= "}\n";
        $a_evaluar .= "array_multisort(\n";
       
        for ($i=1; $i<$n_parametros; $i+=2)
        {
            $a_evaluar .= "  \$campo{$i}, SORT_REGULAR, \$arg_list[".($i+1)."],\n";
        }
        $a_evaluar .= "  \$array_salida);";
   
        eval($a_evaluar);
        return $array_salida;
    }
}

Veamos un ejemplo. Dado un array como este, en el que tenemos comunidades autónomas con distintos datos, que por cualquier razón no traemos de una base de datos, sino que son datos metidos a mano (sino ya traeríamos estos datos ordenados desde la base de datos, no ?)

1
2
3
4
5
6
7
8
9
$comunidades = array();

$comunidades[] = array('nombre'=>'Galicia',         'provincias' => 4, 'habitantes' => 2784169);
$comunidades[] = array('nombre'=>'Aragón',     'provincias' => 3, 'habitantes' => 1326918);
$comunidades[] = array('nombre'=>'Comunidad de Madrid', 'provincias' => 1, 'habitantes' => 6271638);
$comunidades[] = array('nombre'=>'Castilla La Mancha',  'provincias' => 5, 'habitantes' => 2043100);
$comunidades[] = array('nombre'=>'Andalucía',      'provincias' => 8, 'habitantes' => 8202220);
$comunidades[] = array('nombre'=>'Extremadura',     'provincias' => 2, 'habitantes' => 1097744);
$comunidades[] = array('nombre'=>'Castilla y León',    'provincias' => 9, 'habitantes' => 2557330);

Queremos ordenar de forma ascendente y por nombre las comunidades.

1
2
3
4
5
6
$comunidades = ordenar_array($comunidades, 'nombre', SORT_ASC);

foreach($comunidades as $comunidad)
{
    echo '<p> - '.$comunidad['nombre'].', '.$comunidad['provincias'].' provincias - '.number_format($comunidad['habitantes'],0,",",".").' habitantes</p>';
}

Lo cuál nos arroja el siguiente resultado:

– Andalucía, 8 provincias – 8.202.220 habitantes
– Aragón, 3 provincias – 1.326.918 habitantes
– Castilla La Mancha, 5 provincias – 2.043.100 habitantes
– Castilla y León, 9 provincias – 2.557.330 habitantes
– Comunidad de Madrid, 1 provincias – 6.271.638 habitantes
– Extremadura, 2 provincias – 1.097.744 habitantes
– Galicia, 4 provincias – 2.784.169 habitantes

Y ahora de forma descendente y por cantidad de habitantes.

1
2
3
4
5
6
$comunidades = ordenar_array($comunidades, 'habitantes', SORT_DESC);

foreach($comunidades as $comunidad)
{
    echo '<p> - '.$comunidad['nombre'].', '.$comunidad['provincias'].' provincias - '.number_format($comunidad['habitantes'],0,",",".").' habitantes</p>';
}

y su resultado:

– Andalucía, 8 provincias – 8.202.220 habitantes
– Comunidad de Madrid, 1 provincias – 6.271.638 habitantes
– Galicia, 4 provincias – 2.784.169 habitantes
– Castilla y León, 9 provincias – 2.557.330 habitantes
– Castilla La Mancha, 5 provincias – 2.043.100 habitantes
– Aragón, 3 provincias – 1.326.918 habitantes
– Extremadura, 2 provincias – 1.097.744 habitantes