php

PHP – Ordenar arreglo por fecha y hora

Ordenar array por datetime en PHP

En este post te mostraré cómo ordenar un arreglo que tiene fecha y hora, usando PHP y la función sort, usort y strcmp.

En el primer ejemplo vamos a ordenar un arreglo plano, que tiene únicamente fechas; en el segundo vamos a ver cómo ordenar un arreglo que tiene un datetime dentro de otro arreglo.

Ordenar arreglo de fechas usando sort

Si tenemos un arreglo plano de fechas, podemos usar la función sort indicando que las queremos ordenar como cadenas, usando la constante SORT_STRING así:

<?php
$arreglo = [
    "2019-07-30 07:00:00",
    "2002-11-24 13:15:20",
    "2007-10-29 15:27:32",
];
echo "Arreglo antes de ordenar: ";
print_r($arreglo);

sort($arreglo, SORT_STRING);
echo "Arreglo DESPUÉS de ordenar: ";
print_r($arreglo);
/*
Salida:
Arreglo antes de ordenar: Array
(
    [0] => 2019-07-30 07:00:00
    [1] => 2002-11-24 13:15:20
    [2] => 2007-10-29 15:27:32
)
Arreglo DESPUÉS de ordenar: Array
(
    [0] => 2002-11-24 13:15:20
    [1] => 2007-10-29 15:27:32
    [2] => 2019-07-30 07:00:00
)
*/

De esta manera se puede ordenar un arreglo de datetimes, pues las mismas son tratadas como strings.

Sigue leyendo para entenderlo de mejor manera

Las fechas son cadenas

Las fechas o datetimes son, al final de cuentas, cadenas.

Y si se ordenan lexicográficamente, se ordenan también por fecha. Es decir, al comparar cadenas con PHP y strcmp, la siguiente cadena:

2019-07-30 20:15:22

Es “menor” que la siguiente:

2019-07-30 20:15:23

Ya que si ordenamos según el abecedario (a está antes que b, 1 está antes que 2, etcétera), el último dígito 3 es mayor que el 2.

No te confundas, hablamos de dígitos como cadena, no como enteros.

Ordenar arreglo anidado, por fecha y hora

Ahora veamos el segundo caso en donde tenemos un arreglo que a su vez tiene otros arreglos.

No podemos ordenarlos con sort, porque sort infiere que son datos planos, no arreglos.

En cambio, podemos usar usort, que tiene una sintaxis así y permite especificar una función de ordenamiento:

usort($arreglo, función_de_orden)

La función, que es el segundo argumento, debe devolver 1, 0 o -1; y recibirá ambos elementos a comparar.

Es nuestra responsabilidad comparar los elementos y devolver el valor.

<?php
$arreglo = [
    [
        "hora" => "07:00:00",
        "fecha" => "2019-07-30",
        "datetime" => "2019-07-30 07:00:00",
    ],
    [
        "hora" => "13:15:20",
        "fecha" => "2002-11-24",
        "datetime" => "2002-11-24 13:15:20",
    ],
    [
        "hora" => "15:27:32",
        "fecha" => "2007-10-29",
        "datetime" => "2007-10-29 15:27:32",
    ],
    [
        "hora" => "15:27:33",
        "fecha" => "2007-10-29",
        "datetime" => "2007-10-29 15:27:33",
    ],
];
echo "Arreglo antes de ordenar: ";
print_r($arreglo);

usort($arreglo, function ($a, $b) {
    return strcmp($a["datetime"], $b["datetime"]);
});
echo "Arreglo DESPUÉS de ordenar: ";
print_r($arreglo);

/*
Salida:
Arreglo antes de ordenar: Array
(
    [0] => Array
        (
            [hora] => 07:00:00
            [fecha] => 2019-07-30
            [datetime] => 2019-07-30 07:00:00
        )

    [1] => Array
        (
            [hora] => 13:15:20
            [fecha] => 2002-11-24
            [datetime] => 2002-11-24 13:15:20
        )

    [2] => Array
        (
            [hora] => 15:27:32
            [fecha] => 2007-10-29
            [datetime] => 2007-10-29 15:27:32
        )

    [3] => Array
        (
            [hora] => 15:27:33
            [fecha] => 2007-10-29
            [datetime] => 2007-10-29 15:27:33
        )

)
Arreglo DESPUÉS de ordenar: Array
(
    [0] => Array
        (
            [hora] => 13:15:20
            [fecha] => 2002-11-24
            [datetime] => 2002-11-24 13:15:20
        )

    [1] => Array
        (
            [hora] => 15:27:32
            [fecha] => 2007-10-29
            [datetime] => 2007-10-29 15:27:32
        )

    [2] => Array
        (
            [hora] => 15:27:33
            [fecha] => 2007-10-29
            [datetime] => 2007-10-29 15:27:33
        )

    [3] => Array
        (
            [hora] => 07:00:00
            [fecha] => 2019-07-30
            [datetime] => 2019-07-30 07:00:00
        )

)
*/

Para este problema se puede usar strcmp que compara cadenas y devuelve 0, 1 o -1 indicando respectivamente que las cadenas son iguales, la primera es mayor que la segunda o la primera es menor que la segunda.

En nuestro ejemplo, aunque ordenamos por fecha y hora en PHP, se mueven todos los elementos hermanos del dato.

Como la fecha y hora está en ["datetime"] simplemente regresamos strcmp($arreglo["datetime"], $arreglo["datetime"]) y PHP sabrá ordenar nuestro arreglo; como se ve en el código.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.