Foros del Web » Programando para Internet » PHP »

¿Es posible ordenar un array de objetos?

Estas en el tema de ¿Es posible ordenar un array de objetos? en el foro de PHP en Foros del Web. Tengo el objeto enlace: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class Enlace {       var $titulo ;     var $enlace ;   ...
  #1 (permalink)  
Antiguo 03/01/2013, 11:35
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
¿Es posible ordenar un array de objetos?

Tengo el objeto enlace:
Código PHP:
Ver original
  1. class Enlace { 
  2.     var $titulo;
  3.     var $enlace;
  4.     var $descripcion;  
  5.     function Enlace($titulo, $enlace, $descripcion) {
  6.         $this->setTitulo($titulo);
  7.         $this->setEnlace($enlace);
  8.         $this->setDescripcion($descripcion);
  9.     }  
  10.     function setTitulo($titulo) {
  11.         $this->titulo=$titulo;
  12.     }
  13.     function setEnlace($enlace) {
  14.         $this->enlace=$enlace; 
  15.     }
  16.     function setDescripcion($descripcion) {
  17.         $this->descripcion=$descripcion;
  18.     }  
  19.     function getTitulo() {
  20.         return $this->titulo;
  21.     }
  22.     function getEnlace() {
  23.         return $this->enlace;
  24.     }
  25.     function getDescripcion() {
  26.         return $this->descripcion;
  27.     }
  28. }
  29. $enlaces[] = new enlace('Google', 'www.google.es', 'Ya todos la conocemos' );
  30. $enlaces[] = new enlace('Foros del web', 'forosdelweb.com', 'Descripción de la web');
  31. foreach ($enlaces AS $enlace) {        
  32.     echo "<li><a class='par' title='{$enlace->getDescripcion()}' href='{$enlace->getEnlace()}' target='_blank'>{$enlace->getTitulo()}</a></li>";
  33. }

¿Como se ordenarían por título?

Realmente lo lógico es que vinieran de una base de datos y ahí se ordenarían pero simplemente estoy probando varias cosas con objetos y me encontré con esta duda. Le di bastantes vueltas y no se me ocurre ninguna forma excepto extraer los titulos y sus indices a otro array, ordenarlos y luego ordenar el array de objetos a partir del otro array. No se si me expliqué.

¿Hay alguna función o forma?
  #2 (permalink)  
Antiguo 03/01/2013, 11:47
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: ¿Es posible ordenar un array de objetos?

Puedes hacer algo así:

Código PHP:
Ver original
  1. function cmp($a, $b) {
  2.     return strcmp($a->titulo, $b->titulo);
  3. }
  4.  
  5. usort($enlaces, "cmp");
  6.  
  7. echo '<pre>';
  8. print_r($enlaces);
  9. echo '</pre>';

Cita:
Array
(
[0] => Enlace Object
(
[titulo] => Foros del web
[enlace] => forosdelweb.com
[descripcion] => Descripción de la web
)

[1] => Enlace Object
(
[titulo] => Google
[enlace] => www.google.es
[descripcion] => Ya todos la conocemos
)

)
Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 03/01/2013, 13:00
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: ¿Es posible ordenar un array de objetos?

Además de lo que comenta andresdzphp te sugiero que actualices tu clase, a no ser que a día de hoy estés utilizando PHP 4.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 03/01/2013 a las 13:14
  #4 (permalink)  
Antiguo 04/01/2013, 02:14
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: ¿Es posible ordenar un array de objetos?

No. Utilizo PHP5. ¿Que es lo que debería actualizar? ¿Lo dices por el constructor? Otra cosa no se me ocurre. O lo dices por la falta de "privates, protected y publics". La verdad es que no los uso porque aun no los entendí muy bien. Por defecto entiendo que están en public.

Ahora pruebo a ordenarlo así. Gracias.

EDIT:
Funciona de lujo. Muchas gracias.
Aunque no entiendo para nada lo que hace la funcion cmp ni strcmp, así el por qué usort lleva el nombre de la función entre comillas. Ya me leí la documentación de PHP de las funciones y no lo pillo.

Cambié la clase y la puse así:
Código PHP:
Ver original
  1. class Enlace { 
  2.     private $titulo;
  3.     private $enlace;
  4.     private $descripcion;      
  5.     public function Enlace($titulo, $enlace, $descripcion) {
  6.         $this->setTitulo($titulo);
  7.         $this->setEnlace($enlace);
  8.         $this->setDescripcion($descripcion);
  9.     }  
  10.     private function setTitulo($titulo) {
  11.         $this->titulo=$titulo;
  12.     }
  13.     private function setEnlace($enlace) {
  14.         $this->enlace=$enlace; 
  15.     }
  16.     private function setDescripcion($descripcion) {
  17.         $this->descripcion=$descripcion;
  18.     }  
  19.     public function getTitulo() {
  20.         return $this->titulo;
  21.     }
  22.     public function getEnlace() {
  23.         return $this->enlace;
  24.     }
  25.     public function getDescripcion() {
  26.         return $this->descripcion;
  27.     }
  28. }

Así está mejor?

Aunque no se por qué no puedo poner 'private class Enlace' ni public ni nada. Si la pusiera private entiendo que no se podría hacer un extend de esta clase no? Pero no me deja usarlo.

Muchas gracias nuevamente y un saludo.

Última edición por alyciashape; 04/01/2013 a las 02:56
  #5 (permalink)  
Antiguo 04/01/2013, 03:59
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 7 meses
Puntos: 33
Respuesta: ¿Es posible ordenar un array de objetos?

Buenas!

Por lo que deduzco del contexto y de mis conocimientos de JAVA y OOP, me atrevería a decir que usort hace lo siguiente:

Código:
usort(array, string);

busca la función que se describe en el string y ordena array usando la función.
La función cmp, andresdzphp la ha declarado para incluir ahí un strcmp (comparación entre dos strings), para poder usarla en usort.

A fin de cuentas, está diciendo a usort que tiene que ordene usando como referencia la función cmp, que compara los títulos de dos objetos.

Espero que esto te aclare un poco tus dudas.

Saludos!
  #6 (permalink)  
Antiguo 04/01/2013, 05:45
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: ¿Es posible ordenar un array de objetos?

@alyciashape, no se puede marcar una clase como privada simplemente porque PHP no tiene soporte para tal feature, en relación a usort y strcmp, lee la documentación de cada función, la función de comparación de usort necesita justamente lo que retorna strcmp..., sobre tu clase, deberías utilizar __construct en vez del nombre de la clase y estas seguro que los mutators deben ser privados ?
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 04/01/2013 a las 05:53
  #7 (permalink)  
Antiguo 04/01/2013, 06:28
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: ¿Es posible ordenar un array de objetos?

Lo cierto es que usé el nombre de la clase como constructor en lugar de __construct porque así me lo recomendó mi profesor de Java. Dice que es mejor así porque sigue los estandares.

Llevo menos de 1 mes con Java pero de hecho así es como en Java se hace el constructor.

Código PHP:
Ver original
  1. function cmp($a, $b) {
  2.     return strcmp($a->titulo, $b->titulo);
  3. }
  4. usort($enlaces, "cmp");

Si, a usort le pasas el array y la "forma" en que ordena. Pero me parece muy raro que "cmp" vaya entre comillas no lo pillo. Y luego los parametros que usa cmp se supone que son 2 elementos del array a comparar no? y los devuelve en el orden adecuado.

Muchas gracias por el tutorial.

Supongo que con los mutators te refieres a los setters. Realmente es sólo una práctica así que no importa demasiado pero yo creo que si ya que los enlaces los instancio ya con todos los datos y no quiero que se modifiquen una vez creados.
  #8 (permalink)  
Antiguo 04/01/2013, 09:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Es posible ordenar un array de objetos?

Claro en Java es lo mejor, sin embargo en PHP la forma correcta es __construct() y en versiones posteriores de PHP ya no te va a reconocer el nombre de la clase como constructor y te marcará un error.

Saludos.
  #9 (permalink)  
Antiguo 04/01/2013, 09:43
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: ¿Es posible ordenar un array de objetos?

Cita:
Iniciado por GatorV Ver Mensaje
Claro en Java es lo mejor, sin embargo en PHP la forma correcta es __construct() y en versiones posteriores de PHP ya no te va a reconocer el nombre de la clase como constructor y te marcará un error.

Saludos.
Eso sólo pasa cuando se usan namespaces y a partir de PHP 5.3.3 o me equivoco?

alyciashape debes usar __construct(), PHP es una cosa y JAVA es otra.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #10 (permalink)  
Antiguo 04/01/2013, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Es posible ordenar un array de objetos?

Así es, después de PHP5.3.3 y usando Namespaces, pero como bien dices PHP y Java son cosas muy diferentes
  #11 (permalink)  
Antiguo 04/01/2013, 10:54
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: ¿Es posible ordenar un array de objetos?

Pues que raro. Él es programador de Java y PHP entre otros y me recomendó eso en lugar de __construct que es lo que yo hacía siempre. De hecho ya uso PHP 5.4.X sino me equivoco.

No conocía eso de los namespaces. Aquí siempre se aprende algo nuevo.

Pues me fiaré de vosotros la verdad. Un saludo y gracias.
  #12 (permalink)  
Antiguo 04/01/2013, 11:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Es posible ordenar un array de objetos?

Pues no ha de ser un buen programador, ya que un buen programador aunque sepa de Java y PHP, sabe exactamente las características de cada lenguaje y no trata de replicar un lenguaje en otro, si no que sabe bien las limitantes y beneficios de cada uno.

Yo por ejemplo programo en Java y PHP, y no trato de replicar uno en otro, se que beneficios tiene uno y otro, también se que aplicar en un lenguaje y en otro.

Saludos.

Etiquetas: posible
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:45.