Foros del Web » Programando para Internet » PHP »

Ordenando una matriz

Estas en el tema de Ordenando una matriz en el foro de PHP en Foros del Web. Tengo una matriz, producto de una consulta. Deseo ordenar sus elementos de acuerdo al campo N_SOLICITUD, pero el orden que requiero no es ascendente ni ...
  #1 (permalink)  
Antiguo 12/07/2012, 08:15
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 3 meses
Puntos: 194
Ordenando una matriz

Tengo una matriz, producto de una consulta. Deseo ordenar sus elementos de acuerdo al campo N_SOLICITUD, pero el orden que requiero no es ascendente ni descendente, si no, la aparición de los registros "Pendiente" primeros.

Tengo la posibilidad de modificar el procedimiento oracle que contiene la consulta, o el php que recibe el arreglo. Lo que no puedo hacer es modificar la tabla agregando un campo orden que seria lo mas natural :/

La matriz tiene una forma similar a esta.
Código PHP:
Ver original
  1.   0 =>
  2.     array
  3.       'NOMBRE' => string 'DARIO HOYOS' (length=11)
  4.       'EMAIL' => string '[email protected]' (length=13)
  5.       'C_LEGAJO' => string '11111' (length=5)
  6.       'OBSERVACIONES' => string 'asdasd' (length=6)
  7.       'C_ESTADOUSUARIO' => string '1' (length=1)
  8.       'FECHA_ALTA' => string '10/07/2012' (length=10)
  9.       'D_ESTADOUSUARIO' => string 'Aprobado' (length=8)
  10.       'N_SOLICITUD' => string '61' (length=2)
  11.   1 =>
  12.     array
  13.       'NOMBRE' => string 'Dario Hoyos' (length=11)
  14.       'EMAIL' => string '[email protected]' (length=18)
  15.       'C_LEGAJO' => string '62631' (length=5)
  16.       'OBSERVACIONES' => string 'probando1234' (length=12)
  17.       'C_ESTADOUSUARIO' => string '1' (length=1)
  18.       'FECHA_ALTA' => string '05/07/2012' (length=10)
  19.       'D_ESTADOUSUARIO' => string 'Pendiente' (length=8)
  20.       'N_SOLICITUD' => string '50' (length=2)
  21.   2 =>
  22.     array
  23.       'NOMBRE' => string 'DARIO HOYOS2' (length=12)
  24.       'EMAIL' => string '[email protected]' (length=18)
  25.       'C_LEGAJO' => string '11112' (length=5)
  26.       'OBSERVACIONES' => string 'asdas' (length=5)
  27.       'C_ESTADOUSUARIO' => string '1' (length=1)
  28.       'FECHA_ALTA' => string '10/07/2012' (length=10)
  29.       'D_ESTADOUSUARIO' => string 'Rechazado' (length=8)
  30.       'N_SOLICITUD' => string '62' (length=2)

Y el procedimiento (algo enredoso) es este

Código SQL:
Ver original
  1. PROCEDURE sp_usuarios_en_sistema (p_fecha_desde IN VARCHAR2, p_fecha_hasta IN VARCHAR2, p_estado_usuario IN INTEGER, p_legajo IN INTEGER, p_nombre IN VARCHAR2,  p_tipo_usuario IN INTEGER,  p_n_solicitud IN INTEGER ,p_recordset OUT CURSOR_TYPE)
  2.   AS
  3.   BEGIN
  4.     OPEN p_recordset FOR
  5.     SELECT
  6.             U.nombre,
  7.             U.email,
  8.             U.c_legajo,
  9.             U.observaciones,
  10.             U.c_estadousuario,
  11.             TO_CHAR(U.fecha_alta, 'dd/mm/yyyy')fecha_alta,
  12.             E.d_estadousuario,
  13.             R.n_solicitud
  14.     FROM   cc_usuario U
  15.     INNER JOIN cc_estadousuario E
  16.     ON U.c_estadousuario = E.c_estadousuario
  17.     INNER JOIN
  18.         (SELECT DISTINCT n_solicitud, c_usuario
  19.         FROM cc_rol_usuario
  20.         WHERE c_usuario NOT IN (SELECT DISTINCT c_usuario FROM cc_rol_usuario WHERE c_tipousuario = 1 AND c_estado = 1)
  21.         ) R
  22.     ON U.c_usuario = R.c_usuario
  23.     WHERE U.c_estadousuario <> 4
  24.     AND (p_fecha_desde IS NULL OR TO_DATE(p_fecha_desde,'dd/mm/yyyy')  <= TRUNC(U.fecha_alta))
  25.     AND (p_fecha_hasta IS NULL OR TO_DATE(p_fecha_hasta,'dd/mm/yyyy') >= TRUNC(U.fecha_alta) )
  26.     AND (p_estado_usuario IS NULL OR p_estado_usuario = U.c_estadousuario OR p_estado_usuario = 0)
  27.     AND (p_legajo IS NULL OR p_legajo = U.c_legajo OR p_legajo = 0)
  28.     AND (p_nombre IS NULL OR UPPER(U.nombre) LIKE '%' || UPPER(p_nombre) || '%')
  29.     AND (p_tipo_usuario IS NULL OR p_tipo_usuario = 0 OR EXISTS (SELECT 1
  30.                                                                 FROM cc_rol_usuario j
  31.                                                                 WHERE j.c_usuario = U.c_usuario
  32.                                                                 AND j.c_tipousuario = p_tipo_usuario
  33.                                                                 ))
  34.     AND (p_n_solicitud IS NULL OR p_n_solicitud = R.n_solicitud OR p_n_solicitud = 0)
  35.     ORDER BY U.nombre;
  36.   END sp_usuarios_en_sistema;
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #2 (permalink)  
Antiguo 12/07/2012, 09:20
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 12 años, 4 meses
Puntos: 20
Respuesta: Ordenando una matriz

Existen funciones php para ordenar arrays de acuerdo a tus necesidades.

Este es el manual oficial
http://php.net/manual/es/array.sorting.php

Y acá varios ejemplos
http://www.desarrolloweb.com/articulos/ordenar-arrays-php.html
  #3 (permalink)  
Antiguo 12/07/2012, 09:41
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 3 meses
Puntos: 194
Respuesta: Ordenando una matriz

Cita:
Iniciado por topo_bionico Ver Mensaje
Existen funciones php para ordenar arrays de acuerdo a tus necesidades.

Este es el manual oficial
http://php.net/manual/es/array.sorting.php

Y acá varios ejemplos
http://www.desarrolloweb.com/articul...rrays-php.html
La verdad que no, no leíste detenidamente mi enunciado y me estas dando una respuesta automática, agradezco de todas maneras, ya conozco las funciones de ordenamiento. Pero como mencione, por las pre condiciones no son aplicables. Justamente porque lo que quiero ordenar esta en medio del alfabeto, y quiero que aparezca en un extremo.

Ya vi en otras respuestas tuyas casos similares donde no lees lo anterior y te apresuras a comentar. Agradezco tus intenciones de todas maneras, pero como consejo deberías ser un pelin menos ansioso.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #4 (permalink)  
Antiguo 12/07/2012, 10:16
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 12 años, 4 meses
Puntos: 20
Respuesta: Ordenando una matriz

Cita:
Iniciado por h2swider Ver Mensaje
La verdad que no, no leíste detenidamente mi enunciado y me estas dando una respuesta automática, agradezco de todas maneras, ya conozco las funciones de ordenamiento. Pero como mencione, por las pre condiciones no son aplicables. Justamente porque lo que quiero ordenar esta en medio del alfabeto, y quiero que aparezca en un extremo.

Ya vi en otras respuestas tuyas casos similares donde no lees lo anterior y te apresuras a comentar. Agradezco tus intenciones de todas maneras, pero como consejo deberías ser un pelin menos ansioso.
Si no queres usar funciones no puedo obligarte.


No se como definís y cargas el array, así que hice uno imaginario. Trate de hacerlo simple.
Obviamente no tenes que usar los echo y print_r, solamente los puse para mostrar la salida, te aviso para que no te enojes pensando que no es como vos lo querias.
Algo así te sirve?

Código PHP:
<?php
$a1
=array('NOMBRE'=>"DARIO HOYOS",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Pendiente''N_SOLICITUD'=>'50');
$a2=array('NOMBRE'=>"JUAN CHOCLITO",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Aprobado','N_SOLICITUD'=>'68');
$a3=array('NOMBRE'=>"OSCAR PEREZ",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Rechazado','N_SOLICITUD'=>'34');
$a4=array('NOMBRE'=>"SERGIO DENIS",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Pendiente''N_SOLICITUD'=>'70');

$ordenar=array($a1,$a2,$a3,$a4);
$ordenado=array();//Array vacio para cargar los valores ordenados
foreach($ordenar as $row){ //Recorro el array
    
if ($row['D_ESTADOUSUARIO']=='Pendiente'){
        
array_unshift($ordenado,$row); //Si esta pendiente lo inserto al principio
    
}else{
        
array_push($ordenado,$row); //Sino, lo mando al final
    
}
    
print_r($row);
    echo 
'<br/>';
}
echo 
'------';
echo 
'<br/>';
foreach(
$ordenado as $row){ //Muestro el array ordenado
        
print_r($row);
        echo 
'<br/>';
}
?>

Salida por pantalla:
Código HTML:
Array ( [NOMBRE] => DARIO HOYOS [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Pendiente [N_SOLICITUD] => 50 ) 
Array ( [NOMBRE] => JUAN CHOCLITO [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Aprobado [N_SOLICITUD] => 68 ) 
Array ( [NOMBRE] => OSCAR PEREZ [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Rechazado [N_SOLICITUD] => 34 ) 
Array ( [NOMBRE] => SERGIO DENIS [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Pendiente [N_SOLICITUD] => 50 ) 
------
Array ( [NOMBRE] => SERGIO DENIS [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Pendiente [N_SOLICITUD] => 50 ) 
Array ( [NOMBRE] => DARIO HOYOS [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Pendiente [N_SOLICITUD] => 50 ) 
Array ( [NOMBRE] => JUAN CHOCLITO [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Aprobado [N_SOLICITUD] => 68 ) 
Array ( [NOMBRE] => OSCAR PEREZ [EMAIL] => [email protected] [D_ESTADOUSUARIO] => Rechazado [N_SOLICITUD] => 34 )
  #5 (permalink)  
Antiguo 12/07/2012, 10:33
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años, 6 meses
Puntos: 34
Respuesta: Ordenando una matriz

no entiendo bien cuales son los "pendientes", me lei todo el codigo y no se cuales son. Pero mas que seguro que eso te conviene ordenarlo en la consulta. si es asi podes agregarlo en el order by y listo. Si te los trae al reves, la das vuelta con desc

Código SQL:
Ver original
  1. ...
  2. ORDER BY U.n_solicitud, U.Nombre

Un día un profesor me dijo: "Todo lo que puedas traer ordenado es mejor traerlo ordenado, que andar ordenandolo despues", jejej.
  #6 (permalink)  
Antiguo 12/07/2012, 11:06
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: Ordenando una matriz

Puedes usar uasort() este te permite definir una función propia para ordenar.

Saludos.
  #7 (permalink)  
Antiguo 12/07/2012, 11:29
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años, 6 meses
Puntos: 34
Respuesta: Ordenando una matriz

ah ya entendí ... lo que tenes que hacer es dividir la consulta en 2 y las unis con union me explico?

primero te traes los que sean pendiente, y le das union todo lo demas, asi te quedan los pendientes primero

Código SQL:
Ver original
  1. SELECT * FROM tabla ..........
  2. INNER JOIN .....
  3. WHERE estadousuario LIKE 'pendiente'
  4. ORDER BY ....
  5. UNION
  6. SELECT * FROM tabla ..........
  7. INNER JOIN .....
  8. WHERE estadousuario NOT LIKE 'pendiente'
  9. ORDER BY ....

ahi tenes primero todos los pendientes, luego los otros
  #8 (permalink)  
Antiguo 13/07/2012, 09:05
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 3 meses
Puntos: 194
Respuesta: Ordenando una matriz

Cita:
Iniciado por GatorV Ver Mensaje
Puedes usar uasort() este te permite definir una función propia para ordenar.

Saludos.
Esa no la conocia, era perfectamente lo que necesitaba. Muchas gracias!

Cita:
Iniciado por patriciomase Ver Mensaje
ah ya entendí ... lo que tenes que hacer es dividir la consulta en 2 y las unis con union me explico?

primero te traes los que sean pendiente, y le das union todo lo demas, asi te quedan los pendientes primero

Código SQL:
Ver original
  1. SELECT * FROM tabla ..........
  2. INNER JOIN .....
  3. WHERE estadousuario LIKE 'pendiente'
  4. ORDER BY ....
  5. UNION
  6. SELECT * FROM tabla ..........
  7. INNER JOIN .....
  8. WHERE estadousuario NOT LIKE 'pendiente'
  9. ORDER BY ....

ahi tenes primero todos los pendientes, luego los otros
Esto también es muy interesante, no se me hubiese ocurrido.

Cita:
Iniciado por topo_bionico Ver Mensaje
Si no queres usar funciones no puedo obligarte.


No se como definís y cargas el array, así que hice uno imaginario. Trate de hacerlo simple.
Obviamente no tenes que usar los echo y print_r, solamente los puse para mostrar la salida, te aviso para que no te enojes pensando que no es como vos lo querias.
Algo así te sirve?

Código PHP:
<?php
$a1
=array('NOMBRE'=>"DARIO HOYOS",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Pendiente''N_SOLICITUD'=>'50');
$a2=array('NOMBRE'=>"JUAN CHOCLITO",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Aprobado','N_SOLICITUD'=>'68');
$a3=array('NOMBRE'=>"OSCAR PEREZ",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Rechazado','N_SOLICITUD'=>'34');
$a4=array('NOMBRE'=>"SERGIO DENIS",'EMAIL'=>'[email protected]','D_ESTADOUSUARIO'=>'Pendiente''N_SOLICITUD'=>'70');

$ordenar=array($a1,$a2,$a3,$a4);
$ordenado=array();//Array vacio para cargar los valores ordenados
foreach($ordenar as $row){ //Recorro el array
    
if ($row['D_ESTADOUSUARIO']=='Pendiente'){
        
array_unshift($ordenado,$row); //Si esta pendiente lo inserto al principio
    
}else{
        
array_push($ordenado,$row); //Sino, lo mando al final
    
}
    
print_r($row);
    echo 
'<br/>';
}
echo 
'------';
echo 
'<br/>';
foreach(
$ordenado as $row){ //Muestro el array ordenado
        
print_r($row);
        echo 
'<br/>';
}
?>
Realmente se noto la dedicación puesta en esta ultima.

Es la primera vez que me dan una respuesta tan amplia en el foro, 3 alternativas, 1 algorítmica, una desde sql, y otra desde el standard de PHP. Realmente impecables, espero que sirvan en un futuro a alguien mas.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Última edición por h2swider; 13/07/2012 a las 09:11
  #9 (permalink)  
Antiguo 13/07/2012, 09:14
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 12 años, 4 meses
Puntos: 20
Respuesta: Ordenando una matriz

Cita:
Iniciado por h2swider Ver Mensaje
Esa no la conocia, era perfectamente lo que necesitaba. Muchas gracias!



Esto también es muy interesante, no se me hubiese ocurrido.


Se nota que ni leiste el enlace que te pase en el primer comentario, porque en ese enlace explica como usar esa función.
En vez de leer te dedicaste a hacerte el soberbio.

Encabezado del enlace:
Ordenando Arrays

PHP tiene varias funciones que se ocupan de ordenar arrays (matrices) y este documento existe para ayudar a aclararlo todo.
http://php.net/manual/es/array.sorting.php


No se para que pedís ayuda si no lees lo que te contestan.

Etiquetas: matriz, registro, tabla, usuarios
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 16:14.