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.
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 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.
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.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
Me habéis salvado, gracias por el post, está re uvaaaaaaa.
A la orden.
Saludos!