Foros del Web » Programando para Internet » PHP »

Como ordenar array bidimensional

Estas en el tema de Como ordenar array bidimensional en el foro de PHP en Foros del Web. Hola, despues de buscar, buscar y buscar no he encontrado ninguna solucion a mi problema. Tengo en una variable un array con esta estructura coche[0] ...
  #1 (permalink)  
Antiguo 05/12/2007, 14:17
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Como ordenar array bidimensional

Hola, despues de buscar, buscar y buscar no he encontrado ninguna solucion a mi problema.

Tengo en una variable un array con esta estructura

coche[0]

color=>azul
cilindrada=>2000

coche[1]

color=>rojo
cilindrada=>1500

Etc


Estoy intentando ordenar por cilindrada con array_multisort

Si pongo array_multisort($array,SORT_ASC);

Me lo ordena como le da la gana

Si pongo array_multisort($array=>coche=>cilindrada,SORT_ASC );

Me da fallo. Asi que no se como hacerlo.

Gracias
__________________
Barcode.es
  #2 (permalink)  
Antiguo 05/12/2007, 15:20
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

He probado esto

http://www.forosdelweb.com/f18/faqs-...tml#post393289

Pero me da Error.

El array lo obtengo asi

$xml=simplexml_load_file($url);

Puede que no funcione porque $xml es un objeto de simplexml y no un array?

Saludos
__________________
Barcode.es
  #3 (permalink)  
Antiguo 05/12/2007, 15:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Como ordenar array bidimensional

Ve la documentación de PHP, para ordenar con array_multisort debes de tener un arreglo ordenado por columnas y no por filas.

Saludos.
  #4 (permalink)  
Antiguo 05/12/2007, 17:49
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

Te agradezco el apunte GatorV pero es que no logro entender lo que se hace aqui



Example#3 Ordenamiento de resultados de una base de datos

Para este ejemplo, cada elemento en la matriz datos representa una fila en una tabla. Este tipo de conjunto de datos es típico de los registros en una base de datos.

Datos de ejemplo:

volumen| edicion
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7




Las datos como una matriz, llamada datos. Ésta se obtendría usualmente, por ejemplo, mediante un ciclo con mysql_fetch_assoc().
<?php
$datos[] = array('volumen' => 67, 'edicion' => 2);
$datos[] = array('volumen' => 86, 'edicion' => 1);
$datos[] = array('volumen' => 85, 'edicion' => 6);
$datos[] = array('volumen' => 98, 'edicion' => 2);
$datos[] = array('volumen' => 86, 'edicion' => 6);
$datos[] = array('volumen' => 67, 'edicion' => 7);
?>

En este ejemplo, ordenaremos por volumen descendientemente, y por edicion ascendentemente.

Tenemos una matriz de filas, pero array_multisort() requiere una matriz de columnas, así que usamos el código a continuación para obtener las columnas, y luego realizar el ordenamiento.
<?php
// Obtener una lista de columnas
foreach ($datos as $llave => $fila) {
$volumen[$llave] = $fila['volumen'];
$edicion[$llave] = $fila['edicion'];
}
// Ordenar los datos con volumen descendiente, edicion ascendiente
// Agregar $datos como el último parámetro, para ordenar por la llave común
array_multisort($volumen, SORT_DESC, $edicion, SORT_ASC, $datos);
?>

El conjunto de datos está ordenado ahora, y lucirá de este modo:

volumen| edicion
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7


Donde se queda la matriz ordenada?
Como hago ahora el foreach para recorerr la matriz y obrener los datos?

Saludos
__________________
Barcode.es
  #5 (permalink)  
Antiguo 05/12/2007, 17:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Como ordenar array bidimensional

La matriz ordenada se queda en $datos (si haces un print_r( $datos ) veras la matriz ordenada).

El foreach lo puedes hacer en datos:
Código PHP:
foreach( $datos as $key => $dato ) {
       echo 
$dato['volumen'] . " - " $volumen['edicion'];

Saludos.
  #6 (permalink)  
Antiguo 05/12/2007, 18:03
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

Ok, me sale con el ejemplo pero no me sale con mi fuente array.

Aqui pego datos reales de la estructura de mi array que en realidad es un objeto

ArrayArray ( [0] => SimpleXMLElement Object ( [name] =>


Tiene esto algo que ver para que no me salga?

Saludos
__________________
Barcode.es
  #7 (permalink)  
Antiguo 05/12/2007, 18:09
 
Fecha de Ingreso: septiembre-2007
Mensajes: 220
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: Como ordenar array bidimensional

Si los campos que quieres ordenar no son son objetos supongo que no tendrá que ver.
  #8 (permalink)  
Antiguo 05/12/2007, 18:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Como ordenar array bidimensional

Los campos tienen que ser en dado caso Strings o Enteros, dudo que array_multisort sepa trabajar con Objetos.

Saludos.
  #9 (permalink)  
Antiguo 05/12/2007, 18:27
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

En principio los campos son datos, lo que pasa es que la estructura en vez de ser de tipo array es de tipo SimpleXMLElement Object .

Lo que he leido es que se comporta igual como un array, pero no se si ira bien con la funcion
array_multisort

A ver si alguien me lo puede confirmar.Saludos
__________________
Barcode.es
  #10 (permalink)  
Antiguo 05/12/2007, 18:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 220
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: Como ordenar array bidimensional

Hombre si son variables del objeto no es lo mismo que valores del array... sólo tienes posibilidad de ordenarlos al tenerlos en el array, al conseguir los objetos no??
  #11 (permalink)  
Antiguo 05/12/2007, 18:51
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

Cita:
Iniciado por Sanubrio Ver Mensaje
Hombre si son variables del objeto no es lo mismo que valores del array... sólo tienes posibilidad de ordenarlos al tenerlos en el array, al conseguir los objetos no??

Exacto, es un xml que me viene desordenado y yo quiero extraer la info y ordenarla a mi antojo.

¿Podria cambiar el objeto a un array?

¿Hay alguna forma de hacer lo mismo pero mas facil?

Saludos
__________________
Barcode.es
  #12 (permalink)  
Antiguo 05/12/2007, 19:06
 
Fecha de Ingreso: septiembre-2007
Mensajes: 220
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: Como ordenar array bidimensional

Ordenalo como el ejemplo que has puesto, con un array intermedio con los datos que quieres ordenar y luego el array_multisort:

Código PHP:
$objetos = array(
  array(
'volumen' => 100'edicion' => 2),
  array(
'volumen' => 1000'edicion' => 1),
  array(
'volumen' => 1000'edicion' => 7),
  array(
'volumen' => 1000'edicion' => 5),
  array(
'volumen' => 10000'edicion' => 3),
  array(
'volumen' => 1000'edicion' => 2)
);


$ordenar = array(
  
'volumen' => array(),
  
'edicion' => array()
);
foreach (
$objetos as $clave => $objeto)
{
    
$ordenar['volumen'][$clave] = $objeto['volumen'];
    
$ordenar['edicion'][$clave] = $objeto['edicion'];
}

array_multisort(
  
$ordenar['volumen'], SORT_DESC,
  
$ordenar['edicion'], SORT_ASC,
  
$objetos
);

print_r($objetos); 
  #13 (permalink)  
Antiguo 14/12/2007, 11:00
 
Fecha de Ingreso: febrero-2005
Mensajes: 272
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como ordenar array bidimensional

Gracias Sanubrio

Al final he usado la clase de aqui

http://www.bin-co.com/php/scripts/xml2array/

Saludos
__________________
Barcode.es
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 06:05.