¿Cómo puedo ordenar esta matriz de objetos por uno de sus campos, como name
o count
?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
Heres una mejor manera de usar cierres
Tenga en cuenta que esto no se encuentra en la documentación de PHP, pero si utiliza los cierres 5.3+ se admiten los argumentos invocables.
fuente
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
pero la función de comparación es la misma. Con esto, necesitaría duplicar el código para el cierre en lugar de hacer una llamada a unprotected static
método que necesitaría definir solo una vez en la clase principal.Si desea ordenar valores enteros:
ACTUALIZADO con la cadena, no olvide convertir al mismo registro (superior o inferior)
fuente
si está usando php oop, es posible que deba cambiar a:
fuente
El mismo código estará con el
count
campo.Más detalles sobre
usort
: http://ru2.php.net/usortPor cierto, ¿de dónde sacaste esa matriz? Espero que no de la base de datos?
fuente
$result
contendráTRUE
si tiene éxito, y su comparación debería serlo$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
pero no puedo hacer que funcione :( Recibo algunos avisos y advierto que usort espera que el parámetro 2 sea una devolución de llamada válidaPuede usar esta función (funciona en la versión PHP> = 5.3):
Ejemplo:
fuente
$a->{$key}
y en$b->{$key}
lugar de$a[$key]
y$b[$key]
como estamos, estrictamente hablando, tratando con propiedades en lugar de miembros de la matriz, pero esta seguía siendo la respuesta que estaba buscando.Puedes usar
usort
, así:fuente
Si todo falla aquí hay otra solución:
fuente
La desventaja de todas las respuestas aquí es que usan nombres de campo estáticos , así que escribí una versión ajustada en estilo OOP. Suponiendo que está utilizando métodos getter, podría usar directamente esta Clase y usar el nombre del campo como parámetro . Probablemente alguien lo encuentre útil.
fuente
si quieres ordenar las fechas
fuente
Una alternativa simple que le permite determinar dinámicamente el campo en el que se basa la clasificación:
Esto se basa en la clase Closure , que permite funciones anónimas. Está disponible desde PHP 5.3.
fuente
Si necesita una comparación de cadenas basada localmente, puede usarla en
strcoll
lugar destrcmp
.Recuerde que el primer uso
setlocale
deLC_COLLATE
la información local conjunto si es necesario.fuente
Si está usando esto dentro de Codeigniter, puede usar los métodos:
@rmooney gracias por la sugerencia. Realmente me ayuda.
fuente
Gracias por la inspiración, también tuve que agregar un parámetro externo $ translation
fuente
Si necesita ordenar por un solo campo, entonces
usort
es una buena opción. Sin embargo, la solución se vuelve desordenada rápidamente si necesita ordenar por múltiples campos. En este caso, se puede usar la biblioteca YaLinqo *, que implementa una sintaxis de consulta similar a SQL para matrices y objetos. Tiene una bonita sintaxis para todos los casos:Aquí,
'$v->count'
es una abreviatura defunction ($v) { return $v->count; }
(cualquiera puede ser usado). Estas cadenas de métodos devuelven iteradores, pero puede obtener matrices agregando->toArray()
al final si lo necesita.* desarrollado por mí
fuente
Puede usar la función ordenada de Nspl :
fuente
Esto es lo que tengo para una clase de utilidad
Llámalo:
fuente
Puedes usar usort como este
Si quieres ordenar por número:
O Abc char:
Ver más: https://www.php.net/manual/en/function.usort.php
fuente