Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] ordenando multiarray manteniendo clave (key)

Estas en el tema de ordenando multiarray manteniendo clave (key) en el foro de PHP en Foros del Web. Estimados Estoy buscando una forma de ordenar un array multidimensional, podría hacerlo con array_multisort() pero este me convierte las claves a valores númericos. el arreglo ...
  #1 (permalink)  
Antiguo 21/01/2014, 07:54
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
ordenando multiarray manteniendo clave (key)

Estimados

Estoy buscando una forma de ordenar un array multidimensional, podría hacerlo con array_multisort() pero este me convierte las claves a valores númericos.

el arreglo que tengo es algo así:

$arreglo['juan']=array('votos' => 60, 'edad' => 22);
$arreglo['jose']=array('votos' => 35, 'edad' => 27);
$arreglo['jorge']=array('votos' => 77, 'edad' => 29);
$arreglo['jaime']=array('votos' => 44, 'edad' => 19);

entonces la idea es poder ordenarlos por algún criterio, por ejemplo por votos descendentemente, quedando así:

$arreglo['jorge']=array('votos' => 77, 'edad' => 29);
$arreglo['juan']=array('votos' => 60, 'edad' => 22);
$arreglo['jaime']=array('votos' => 44, 'edad' => 19);
$arreglo['jose']=array('votos' => 35, 'edad' => 27);

Es posible hacer algo así?
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 21/01/2014, 08:06
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: ordenando multiarray manteniendo clave (key)

array_multisort()
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #3 (permalink)  
Antiguo 21/01/2014, 08:09
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: ordenando multiarray manteniendo clave (key)

gracias xSkArx, pero tal como dije, array_multisort no sirve por que deja el arreglo con las claves con numeros en vez de el nombre, o sea ordenando por votos descendentemente queda así con array_multisort:

Código PHP:
Ver original
  1. $arreglo[0]=array('votos' => 77, 'edad' => 29);
  2. $arreglo[1]=array('votos' => 60, 'edad' => 22);
  3. $arreglo[2]=array('votos' => 44, 'edad' => 19);
  4. $arreglo[3]=array('votos' => 35, 'edad' => 27);

Y así pierdo los nombres y deja de servirme :(
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #4 (permalink)  
Antiguo 21/01/2014, 08:30
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: ordenando multiarray manteniendo clave (key)

Pues no estás mostrando como lo estás haciendo, ya que a mi me funciona perfectamente

Código PHP:
Ver original
  1. $arreglo = array();
  2.  
  3. $arreglo['juan']=array('votos' => 60, 'edad' => 22);
  4. $arreglo['jose']=array('votos' => 35, 'edad' => 27);
  5. $arreglo['jorge']=array('votos' => 77, 'edad' => 29);
  6. $arreglo['jaime']=array('votos' => 44, 'edad' => 19);
  7.  
  8. $votos = array();
  9. $edad = array();
  10. foreach( $arreglo as $key => $row ){
  11.     $votos[$key]  = $row['votos'];
  12.     $edad[$key] = $row['edad'];
  13. }
  14. $arrayVotos = $arreglo;
  15. $arrayEdad = $arreglo;
  16.  
  17. //ordenar votos
  18. array_multisort($votos, SORT_ASC, $arrayVotos);
  19. echo "Votos<br>";
  20. echo "<pre>";
  21. print_r( $arrayVotos );
  22. echo "</pre>";
  23.  
  24. //ordenar edad
  25. array_multisort($edad, SORT_DESC , $arrayEdad);
  26. echo "Edad<br>";
  27. echo "<pre>";
  28. print_r( $arrayEdad );
  29. echo "</pre>";

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 21/01/2014, 08:50
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: ordenando multiarray manteniendo clave (key)

Bueno, he probado y tal parece que funciona perfecto, gracias por la ayuda.

Tema solucionado :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #6 (permalink)  
Antiguo 21/01/2014, 08:59
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: ordenando multiarray manteniendo clave (key)

Me alegra que te haya servido . Dos anotaciones más:

La primera, separé ambos arrays a ordenar en vez de trabajar sobre el mismo array. Ya que si lo hacía, la segunda vez que invocaba array_multisort no funcionaba. No entendí a que se debía este comportamiento. Ejemplo de lo que hablo:

Código PHP:
Ver original
  1. //ordenar votos
  2. array_multisort($votos, SORT_ASC, $arreglo);
  3. echo "Votos<br>";
  4. echo "<pre>";
  5. print_r( $arreglo );
  6. echo "</pre>";
  7.  
  8. //ordenar edad
  9. array_multisort($edad, SORT_DESC , $arreglo);
  10. echo "Edad<br>";
  11. echo "<pre>";
  12. print_r( $arreglo );
  13. echo "</pre>";

En el caso anterior solo me funcionó el primer sort

Lo segundo es que si vas a hacer un ordenamiento por dos columnas puedes hacer esto:

Código PHP:
Ver original
  1. $arreglo = array();
  2.  
  3. $arreglo['juan']=array('votos' => 60, 'edad' => 22);
  4. $arreglo['jose']=array('votos' => 35, 'edad' => 27);
  5. $arreglo['jorge']=array('votos' => 77, 'edad' => 29);
  6. $arreglo['jaime']=array('votos' => 44, 'edad' => 19);
  7. $arreglo['pedro']=array('votos' => 44, 'edad' => 22);
  8.  
  9. $votos = array();
  10. $edad = array();
  11. foreach( $arreglo as $key => $row ){
  12.     $votos[$key]  = $row['votos'];
  13.     $edad[$key] = $row['edad'];
  14. }
  15.  
  16. array_multisort($votos, SORT_ASC, $edad, SORT_DESC, $arreglo);
  17. echo "Votos<br>";
  18. echo "<pre>";
  19. print_r( $arreglo );
  20. echo "</pre>";

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 21/01/2014, 10:21
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: ordenando multiarray manteniendo clave (key)

Creo que marqué como solucionado demasiado rápido.

Justo iba a preguntar sobre eso, pero veo que has respondido a mi pregunta...

Todo salió bien usando los nombres de el ejemplo, pero al pasarlo al código real, no me resulta, no se que estoy haciendo mal :(

El arreglo real es así:
Array (
[3]=>Array([Press]=>117.81,[Temp]=>37,[Batt]=>87.4016)
[4]=>Array([Press]=>116.65,[Temp]=>38,[Batt]=>86.6142)
[6]=>Array([Press]=>123.54,[Temp]=>41,[Batt]=>86.6142)
[10]=>Array([Press]=>127.16,[Temp]=>80,[Batt]=>82.6772)
[14]=>Array([Press]=>125.75,[Temp]=>77,[Batt]=>83.4646)
[1]=>Array([Press]=>127.14,[Temp]=>40,[Batt]=>86.6142)
[5]=>Array([Press]=>119.11,[Temp]=>42,[Batt]=>86.6142)
[9]=>Array([Press]=>129.28,[Temp]=>79,[Batt]=>64.567)
[13]=>Array([Press]=>123.51,[Temp]=>71,[Batt]=>81.1024)
[11]=>Array([Press]=>122.25,[Temp]=>72,[Batt]=>82.6772)
[2]=>Array([Press]=>124.72,[Temp]=>40,[Batt]=>87.4016)
)

o sea en vez de nombres uso números (y puede que ese sea el problema)

el script está quedando así:

Código PHP:
Ver original
  1. $ahig=array();
  2. //$alow=array();
  3. //$ahot=array();
  4. //$sumpress=0;
  5. //$sumptemp=0;
  6.  
  7. foreach($SENS as $key=>$val){
  8.     echo 'ahig['.$key.']='.$val['Press'];
  9.     $ahig[$key]=$val['Press'];
  10.     //$alow[$key]=$val['Press'];
  11.     //$ahot[$key]=$val['Temp'];
  12.     //$sumpress=$val['Press'];
  13.     //$sumptemp=$val['Temp'];
  14. }
  15.  
  16. //$arrHot=$SENS;
  17. $arrHig=$SENS;
  18. //$arrLow=$SENS;
  19.  
  20. array_multisort($ahig,SORT_DESC,$arrHig);
  21. echo "<pre>";
  22. echo print_r($ahig);
  23. echo "</pre>";

(por ahora solo estoy intentando ordenar por un valor, trate de hacerlo tal como en tu ejemplo, pero no me sale bien.

la salida del echo dentro del foreach me muestra los datos sin ordenar correctamente:


ahig[3]=117.81
ahig[4]=116.65
ahig[6]=123.54
ahig[10]=127.16
ahig[14]=125.75
ahig[1]=127.14
ahig[5]=119.11
ahig[9]=129.28
ahig[13]=123.51
ahig[11]=122.25
ahig[2]=124.72

Pero la salida del print_r me da los resultados con números del 0 al 10 :(

Array(
[0]=>129.28
[1]=>127.16
[2]=>127.14
[3]=>125.75
[4]=>124.72
[5]=>123.54
[6]=>123.51
[7]=>122.25
[8]=>119.11
[9]=>117.81
[10]=>116.65
)

no entiendo!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #8 (permalink)  
Antiguo 21/01/2014, 10:44
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: ordenando multiarray manteniendo clave (key)

Te aconsejo que siempre que preguntes algo des los datos lo mas reales posibles. Si hubieses leído el manual de array_multisort hubieras visto que:

Cita:
Las llaves asociativas (string) se mantendrán, aunque las llaves numéricas son re-indexadas.
Por ello te di mi respuesta teniendo en cuenta lo que tu mostraste (arrays con llaves asociativos)

Lo que tu pretendes hacer lo puedes hacer de esta manera (idea sacada de aquí http://php.net/asort#71318 ):

Código PHP:
Ver original
  1. function record_sort($records, $field, $reverse=false)
  2. {
  3.     $hash = array();
  4.    
  5.     foreach($records as $record)
  6.     {
  7.         $hash[$record[$field]] = $record;
  8.     }
  9.    
  10.     ($reverse)? krsort($hash) : ksort($hash);
  11.    
  12.     $new_records = array();
  13.    
  14.     foreach($hash as $record)
  15.     {
  16.         $clave = array_search( $record, $records );
  17.         $new_records[$clave] = $record;
  18.     }
  19.    
  20.     return $new_records;
  21. }
  22.  
  23. $SENS = array (
  24.     3  => array('Press' => 117.81, 'Temp' => 37, 'Batt'=>87.4016),
  25.     4  => array('Press' => 116.65, 'Temp' => 38, 'Batt'=>86.6142),
  26.     6  => array('Press' => 123.54, 'Temp' => 41, 'Batt'=>86.6142),
  27.     10 => array('Press' => 127.16, 'Temp' => 80, 'Batt'=>82.6772),
  28.     14 => array('Press' => 125.75, 'Temp' => 77, 'Batt'=>83.4646),
  29.     1  => array('Press' => 127.14, 'Temp' => 40, 'Batt'=>86.6142),
  30.     5  => array('Press' => 119.11, 'Temp' => 42, 'Batt'=>86.6142),
  31.     9  => array('Press' => 129.28, 'Temp' => 79, 'Batt'=>64.567),
  32.     13 => array('Press' => 123.51, 'Temp' => 71, 'Batt'=>81.1024),
  33.     11 => array('Press' => 122.25, 'Temp' => 72, 'Batt'=>82.6772),
  34.     2  => array('Press' => 124.72, 'Temp' => 40, 'Batt'=>87.4016),
  35. );
  36.  
  37. $arrHig = record_sort($SENS, "Press");
  38.  
  39. echo "<pre>";
  40. print_r($arrHig);
  41. echo "</pre>";

Para ordenar en orden descendente debes de poner true el tercer parámetro de la función

PD: Ya te tocaría idear una manera de ordenar por dos o más columnas, si puedo luego lo trato de hacer

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #9 (permalink)  
Antiguo 21/01/2014, 12:04
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: ordenando multiarray manteniendo clave (key)

Te pasaste, me tomo un buen rato entender lo que has hecho pero creo que ya entendí, funciona perfecto.

Espero que no me surjan más problemas.

Gracias de nuevo :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Etiquetas: clave
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 13:23.