Puedes usar en efecto usort
, si no te importa que los índices (numéricos) del nuevo array cambien, en caso contrario podrías usar uasort
. Ambas funciones admiten una función como parámetro donde indicamos cómo queremos el orden. En este caso usaremos nuestra función object_sorter
.
Propongo esta función, algo avanzada y sin duda mejorable que ofrece las siguientes ventajas:
- Puedes re-usarla para ordenar por cualquier clave del objeto que sea pasada en parámetro
- Admite un parámetro de orden opcional (
DESC
), para cuando se quiera ordenar de forma DESC
endente.
- Usa
strnatcmp
, aprovechando de sus ventajas, para hacer las comparaciones.
La función es simplemente esta:
function object_sorter($clave,$orden=null) {
return function ($a, $b) use ($clave,$orden) {
$result= ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) : strnatcmp($a->$clave, $b->$clave);
return $result;
};
}
Y para usarla, solamente le pasas el array.
Para que lo ordene de forma ASC
endente por la clave StarDate
:
usort($objDatos, object_sorter('StartDate'));
Para que lo ordene de forma DESC
endente por la clave StarDate
:
usort($objDatos, object_sorter('StartDate','DESC'));
Prueba completa:
VER DEMO EN REXTESTER
<?php
/*PHP: Ordenar array de objetos por uno de sus miembreos con usort - https://es.stackoverflow.com/q/161586/29967*/
/*Función*/
function object_sorter($clave,$orden=null) {
return function ($a, $b) use ($clave,$orden) {
$result= ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) : strnatcmp($a->$clave, $b->$clave);
return $result;
};
}
/*Objeto original*/
$objDatos =
array(
0 => (object) array(
'Id' => 'e6930148-319f-4b87-bb57-8aae98adfc55',
'State' => 'FINISHED',
'StartDate' => '2019-05-03T08:57:30+02:00',
'EndDate' => '2018-05-03T08:59:17+02:00'
),
1 => (object) array(
'Id' => '4263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
'State' => 'FINISHED',
'StartDate' => '2018-05-03T10:15:39+02:00',
'EndDate' => '2018-05-03T10:15:58+02:00'
),
3 => (object) array(
'Id' => '5263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
'State' => 'FINISHED',
'StartDate' => '2020-05-03T10:15:39+02:00',
'EndDate' => '2018-05-03T10:15:58+02:00'
),
);
/*Original*/
echo "OBJETO ORIGINAL:".PHP_EOL.PHP_EOL;
print_r($objDatos);
/*Orden por defecto (ASCendente)*/
usort($objDatos, object_sorter('StartDate'));
echo PHP_EOL.PHP_EOL."ORDEN ASCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);
/*Orden DESCendente (indicándolo en parámetro)*/
usort($objDatos, object_sorter('StartDate','DESC'));
echo PHP_EOL.PHP_EOL."ORDEN DESCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);
?>
Resultado:
OBJETO ORIGINAL:
Array
(
[0] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[1] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[3] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
ORDEN ASCENDENTE:
Array
(
[0] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[1] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[2] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
ORDEN DESCENDENTE:
Array
(
[0] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[1] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[2] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
Espero te sea de utilidad.
NOTA: Función que podemos adaptar, mejorar e incorporar a nuestra biblioteca utilitaria de código.