reorganizar por ordenar objetos fecha ejemplos campos arreglos arreglo array php arrays sorting object

php - fecha - Ordenar la matriz de objetos por campos de objeto



php ordenar array por 2 campos (17)

El inconveniente de todas las respuestas aquí es que utilizan nombres de campos estáticos , por lo que escribí una versión ajustada en estilo OOP. Suponiendo que está utilizando métodos de obtención, puede usar directamente esta Clase y usar el nombre del campo como parámetro . Probablemente alguien lo encuentre útil.

class CustomSort{ public $field = ''''; public function cmp($a, $b) { /** * field for order is in a class variable $field * using getter function with naming convention getVariable() we set first letter to uppercase * we use variable variable names - $a->{''varName''} would directly access a field */ return strcmp($a->{''get''.ucfirst($this->field)}(), $b->{''get''.ucfirst($this->field)}()); } public function sortObjectArrayByField($array, $field) { $this->field = $field; usort($array, array("Your/Namespace/CustomSort", "cmp"));; return $array; } }

¿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 ) ....


Esto es lo que tengo para una clase de utilidad

class Util { public static function sortArrayByName(&$arrayToSort, $meta) { usort($arrayToSort, function($a, $b) use ($meta) { return strcmp($a[$meta], $b[$meta]); }); } }

Llámalo:

Util::sortArrayByName($array, "array_property_name");


Gracias por las inspiraciones, también tuve que agregar un parámetro de $ traductor externo

usort($listable_products, function($a, $b) { global $translator; return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator)); });


Heres una manera más agradable utilizando cierres

usort($your_data, function($a, $b) { return strcmp($a->name, $b->name); });

Tenga en cuenta que esto no se encuentra en la documentación de PHP, pero si se utilizan más de 5.3 cierres son compatibles donde se pueden proporcionar argumentos invocables.


Puede usar esta función (funciona en la versión de PHP> = 5.3):

function sortArrayByKey(&$array,$key,$string = false,$asc = true){ if($string){ usort($array,function ($a, $b) use(&$key,&$asc) { if($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key})); else return strcmp(strtolower($b{$key}), strtolower($a{$key})); }); }else{ usort($array,function ($a, $b) use(&$key,&$asc) { if($a[$key] == $b{$key}){return 0;} if($asc) return ($a{$key} < $b{$key}) ? -1 : 1; else return ($a{$key} > $b{$key}) ? -1 : 1; }); } }

Ejemplo:

sortArrayByKey($yourArray,"name",true); //String sort (ascending order) sortArrayByKey($yourArray,"name",true,false); //String sort (descending order) sortArrayByKey($yourArray,"id"); //number sort (ascending order) sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)


Puedes usar usort , así:

usort($array,function($first,$second){ return strcmp($first->name, $second->name); });


Puedes usar la función sorted de Nspl :

use function /nspl/a/sorted; use function /nspl/op/propertyGetter; use function /nspl/op/methodCaller; // Sort by property value $sortedByCount = sorted($objects, propertyGetter(''count'')); // Or sort by result of method call $sortedByName = sorted($objects, methodCaller(''getName''));


Si está usando esto dentro de Codeigniter, puede usar los métodos:

usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller.

@rmooney gracias por la sugerencia. Realmente me ayuda.


Si está utilizando php oop, es posible que deba cambiar a:

public static function cmp($a, $b) { return strcmp($a->name, $b->name); } //in this case FUNCTION_NAME would be cmp usort($your_data, array(''YOUR_CLASS_NAME'',''FUNCTION_NAME''));


Si necesita ordenar por un solo campo, usort es una buena opción. Sin embargo, la solución se vuelve desordenada rápidamente si necesita ordenar por varios campos. En este caso, se puede utilizar la biblioteca * YaLinqo , que implementa una sintaxis de consulta similar a SQL para matrices y objetos. Tiene una bonita sintaxis para todos los casos:

$sortedByName = from($objects)->orderBy(''$v->name''); $sortedByCount = from($objects)->orderBy(''$v->count''); $sortedByCountAndName = from($objects)->orderBy(''$v->count'')->thenBy(''$v->name'');

Aquí, ''$v->count'' es una abreviatura de la function ($v) { return $v->count; } function ($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 mi


Si necesita una comparación de cadenas local, puede usar strcoll lugar de strcmp .

Recuerde utilizar primero setlocale con LC_COLLATE para establecer la información de configuración regional si es necesario.

usort($your_data,function($a,$b){ setlocale (LC_COLLATE, ''pl_PL.UTF-8''); // Example of Polish language collation return strcoll($a->name,$b->name); });


Si quieres ordenar valores enteros:

// Desc sort usort($array,function($first,$second){ return $first->number < $second->number; }); // Asc sort usort($array,function($first,$second){ return $first->number > $second->number; });

ACTUALIZADO con la cadena no olvide convertir al mismo registro (superior o inferior)

// Desc sort usort($array,function($first,$second){ return strtolower($first->text) < strtolower($second->text); }); // Asc sort usort($array,function($first,$second){ return strtolower($first->text) > strtolower($second->text); });


Si todo falla aquí hay otra solución:

$names = array(); foreach ($my_array as $my_object) { $names[] = $my_object->name; //any object field } array_multisort($names, SORT_ASC, $my_array); return $my_array;


Una alternativa simple que le permite determinar dinámicamente el campo en el que se basa la clasificación:

$order_by = ''name''; usort($your_data, function ($a, $b) use ($order_by) { return strcmp($a->{$order_by}, $b->{$order_by}); });

Esto se basa en la clase Closure , que permite funciones anónimas. Está disponible desde PHP 5.3.


Use usort , aquí hay un ejemplo adaptado del manual:

function cmp($a, $b) { return strcmp($a->name, $b->name); } usort($your_data, "cmp");

Ediciones importadas de los comentarios:

Si está ordenando la matriz desde dentro de la clase y su función de clasificación cmp también está definida dentro de la clase, entonces use esto:

usort($your_data, array($this, "cmp"))


si quieres ordenar fechas

usort($threads,function($first,$second){ return strtotime($first->dateandtime) < strtotime($second->dateandtime); });


usort($array, ''my_sort_function''); var_dump($array); function my_sort_function($a, $b) { return $a->name < $b->name; }

El mismo código estará con el campo de count .

Más detalles sobre usort : http://ru2.php.net/usort

Por cierto, ¿de dónde sacaste esa matriz? Espero que no sea de base de datos?