Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ordenar Array de Mayor a menor por valor de atributo

Estas en el tema de Ordenar Array de Mayor a menor por valor de atributo en el foro de PHP en Foros del Web. Buenas caballer@s! Lo que necesito hacer mira que es una tonteria, pero no tengo narices de sacarla. Os cuento la historia y después os muestro ...
  #1 (permalink)  
Antiguo 29/01/2014, 16:16
 
Fecha de Ingreso: junio-2008
Mensajes: 34
Antigüedad: 15 años, 10 meses
Puntos: 0
Ordenar Array de Mayor a menor por valor de atributo

Buenas caballer@s!

Lo que necesito hacer mira que es una tonteria, pero no tengo narices de sacarla.
Os cuento la historia y después os muestro el código.

Tengo un .xml con una tracklist y diferentes tracks, cada track tiene varios valores como: nombre, url, votos y posicion.
Y por otro lado tengo una web donde QUIERO mostrar esos registros del .xml ordenados de MAYOR a menor según el nº de votos de cada track.

El .xml
Código:
<tracklist>
		<track>
			<nombre>track 01</nombre>
			<url>_</url>
			<votos>10</votos>
			<posicion>4</posicion>
		</track>
		<track>
			<nombre>track 02</nombre>
			<url>_</url>
			<votos>20</votos>
			<posicion>3</posicion>
		</track>
		<track>
			<nombre>track 03</nombre>
			<url>_</url>
			<votos>5</votos>
			<posicion>5</posicion>
		</track>
            <tracklist>
He probado con el método de ordenación de Burbuja, pero ni en ASC ni en DESC.
El código php:
Código:
$p = 0;
	foreach($info->tracklist->track as $track){
		$lista[$p] = $track;
		$p++;
	}
	$numTracks = count($lista);

	for ($i=0; $i<$numTracks; $i++){ 
	    for($j=0; $j<$numTracks; $j++){ 
			if(($lista[$i]->votos) < ($lista[$j]->votos)){ 
				$temp = $lista[$i]; 
				$lista[$i]=$lista[$j]; 
				$lista[$j]=$temp;
				
				echo "<br><br>";
				echo "Nombre: ".$lista[$i]->nombre." | Votos: ".$lista[$i]->votos;
			} 
		}
	}

A ver si los que trabajais dia a dia con este lenguage me podeis echar una mano.
Muchas gracias!
  #2 (permalink)  
Antiguo 29/01/2014, 16:38
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 9 meses
Puntos: 27
Respuesta: Ordenar Array de Mayor a menor por valor de atributo

yo haria algo como esto, cambia lo necesario por el tema del los objetos, pero me parece que funciona.
Código PHP:
$p 0;
    foreach(
$info->tracklist->track as $track){
        
$lista[$p] = $track;
        
$p++;
    }

$lista_aux $lista;
foreach( 
$lista as $key=>$elem ){
   
$guarda $elem;
   
$guarda_key $elem;
   foreach( 
$lista_aux as $key_aux=>$elem_aux ){
     if( 
$elem_aux<$guarda ){
       
$guarda $elem_aux;
       
$guarda_key $key_aux;
     }
  }
  
$resultado[] = $guarda;
  unset( 
$lista_aux[$guarda_key] );

  #3 (permalink)  
Antiguo 29/01/2014, 16:51
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ordenar Array de Mayor a menor por valor de atributo

sub7, no estás utilizando correctamente el método de ordenación burbuja, el contador del segundo bucle, debe iniciar con el valor del contador del primer bucle pero aumentado en uno.

Un pequeño ejemplo con datos ficticios:

Código PHP:
Ver original
  1. $lista[]->votos = 5;
  2. $lista[]->votos = 3;
  3. $lista[]->votos = 8;
  4. $lista[]->votos = 4;
  5.  
  6. for ($i = 0; $i < $numTracks; $i++){
  7.     for($j = $i + 1; $j < $numTracks; $j++){
  8.         if($lista[$i]->votos > $lista[$j]->votos){
  9.             $temp = $lista[$j];
  10.             $lista[$j] = $lista[$i];
  11.             $lista[$i] = $temp;
  12.         }
  13.     }
  14. }
  15.  
  16. foreach ($lista as $d){
  17.     echo "Votos: " . $d->votos . "\n";
  18. }

Lo anterior imprime esto:

Código HTML:
Ver original
  1. Votos: 3
  2. Votos: 4
  3. Votos: 5
  4. Votos: 8

Y si quieres invertir el orden, solamente cambia el "mayor que" por "menor que" en la condición.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #4 (permalink)  
Antiguo 30/01/2014, 09:29
 
Fecha de Ingreso: junio-2008
Mensajes: 34
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Ordenar Array de Mayor a menor por valor de atributo

Buenas tardes!

He probado ambos códigos y con ninguno me funcionaba.
Se me ha encendido la bombilla y digo: "¿Y si me está tratando el valor de 'votos' como texto en lugar de numeros?" Pues le puesto un precioso (int) delante de cada uno y APARCAO!

Muchas gracias a los 2 por contestar y ayudarme.
Os dejo el código funcionando para el que le pueda servir.

Código PHP:
    // Ordeno el array de MAYOR a menor por votos
    
for ($i 0$i $numTracks$i++){ 
        for(
$j $i 1$j $numTracks$j++){ 
            if((int)(
$lista[$i]->votos) < (int)($lista[$j]->votos)){ 
                
$temp $lista[$j]; 
                
$lista[$j] = $lista[$i]; 
                
$lista[$i] = $temp;
            } 
        }
    } 
  #5 (permalink)  
Antiguo 30/01/2014, 09:41
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ordenar Array de Mayor a menor por valor de atributo

El que los valores hayan sido tratados como cadenas o números, es indiferente para el método de la burbuja, de todos modos ordenaría los datos en el orden que se establezca, probablemente hiciste hecho algo mal y por eso no pudiste ordenarlos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: mayor, menor, registro, valor
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 17:48.