Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ordenar 2 array en 1

Estas en el tema de Ordenar 2 array en 1 en el foro de PHP en Foros del Web. Hola, durante la tarde del día de hoy se me presentó una situación que hasta el momento no pude resolver. Realizo la siguiente consulta a ...
  #1 (permalink)  
Antiguo 26/02/2013, 17:59
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 0
Ordenar 2 array en 1

Hola, durante la tarde del día de hoy se me presentó una situación que hasta el momento no pude resolver.

Realizo la siguiente consulta a una base de datos MySQL:

Código MySQL:
Ver original
  1. SELECT object_sid, value, id, complex_enum FROM listings_properties WHERE id = "referencia_comp:nombre_ref" OR id = "referencia_comp:ref_email"

Y me devuelve los siguientes datos:

Código MySQL:
Ver original
  1. +------------+---------------------------------+----------------------------+--------------+
  2. | object_sid | value                           | id                         | complex_enum |
  3. +------------+---------------------------------+----------------------------+--------------+
  4. |        559 | Juan Socotroco                  | referencia_comp:nombre_ref |            1 |
  5. |        573 | Rararara                        | referencia_comp:nombre_ref |            1 |
  6. |        573 | SASASAS                         | referencia_comp:nombre_ref |            2 |
  7. |        561 | Roberto Sanchez                 | referencia_comp:nombre_ref |            1 |
  8. |        562 |                                 | referencia_comp:nombre_ref |            1 |
  9. |        557 |                                 | referencia_comp:nombre_ref |            1 |
  10. |        574 |                                 | referencia_comp:nombre_ref |            1 |
  11. |        541 |                                 | referencia_comp:nombre_ref |            1 |
  12. |        545 |                                 | referencia_comp:nombre_ref |            1 |
  13. |        559 | [email protected] | referencia_comp:ref_email  |            1 |
  14. |        562 |                                 | referencia_comp:ref_email  |            1 |
  15. |        573 | [email protected] | referencia_comp:ref_email  |            1 |
  16. |        561 | roberto.sanchez@coca-cola.com   | referencia_comp:ref_email  |            1 |
  17. |        557 |                                 | referencia_comp:ref_email  |            1 |
  18. |        573 | [email protected]                 | referencia_comp:ref_email  |            2 |
  19. |        574 |                                 | referencia_comp:ref_email  |            1 |
  20. |        541 |                                 | referencia_comp:ref_email  |            1 |
  21. |        545 |                                 | referencia_comp:ref_email  |            1 |
  22. +------------+---------------------------------+----------------------------+--------------+

Lo que yo necesito hacer es a partir de esos datos sabiendo que los datos reales comparten object_sid y complex_enum es armar un array que contenga el nombre y el e-mail de la persona.

Lo que hice hasta el momento es separar los datos devueltos por la base de datos en 2 arrays distintos: uno para los nombres y el otro para los e-mail:

Código PHP:
Ver original
  1. foreach ($this->userData as $k)        
  2. {      
  3.     if ($k['id'] == 'referencia_comp:nombre_ref')  
  4.     {
  5.         $arrayNombre[] = array('id' => $k['object_sid'], 'complex' => $k['complex_enum'], 'nombre' => $k['value']);
  6.     }
  7.     else
  8.     {
  9.         $arrayMails[] = array('id' => $k['object_sid'], 'complex' => $k['complex_enum'], 'email' => $k['value']);
  10.     }
  11. }                              
  12.    
  13. $arrayAux = array_merge($arrayNombre, $arrayMails);

Después de eso los unifiqué en un array nuevo y lo ordené por id:

Código PHP:
Ver original
  1. $arrayAux = array_merge($arrayNombre, $arrayMails);
  2. usort($arrayAux, array('Excel', 'orderArrayByID'));
  3.  
  4. private function orderArrayByID($a, $b)    
  5. {      
  6.     return ($a['id'] == $b['id']) ? 0 : $a['id'] > $b['id'] ? 1 : -1;  
  7. }

Se me había ocurrido recorrer el array con un for pero al entrar en el segundo es como que devuelve mal los resultados:

Código PHP:
Ver original
  1. for ($i = 0; $i < count($arrayAux) - 1; $i++)
  2. {  
  3.     for ($j = 1; $j < count($arrayAux); $j++)      
  4.     {              
  5.         if ($arrayAux[$i]['id'] == $arrayAux[$j]['id'] && $arrayAux[$i]['complex'] == $arrayAux[$j]['complex'])    
  6.         {                      
  7.             $finalArray[] = isset($array[$i]['nombre']) ? array('nombre' => $arrayAux[$i]['nombre'], 'email' => $arrayAux[$j]['email']) : array('nombre' => $arrayAux[$j]['nombre'], 'email' => $arrayAux[$i]['email']);
  8.         }      
  9.     }  
  10. }

Limpio los valores que no estan completos y re-indexo el array:

Código PHP:
Ver original
  1. foreach ($finalArray as $k => $v)
  2. {
  3.     if (empty($v['nombre']) || empty($v['email']))
  4.         unset($finalArray[$k]);
  5. }
  6.  
  7. $finalArray = array_values($finalArray);

Y me queda:

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [nombre] => Juan Socotroco
  5.             [email] => juancito.socotroco@testmail.com
  6.         )
  7.  
  8.     [1] => Array
  9.         (
  10.             [nombre] => Roberto Sanchez
  11.             [email] => roberto.sanchez@coca-cola.com
  12.         )
  13.  
  14.     [2] => Array
  15.         (
  16.             [nombre] => SASASAS
  17.             [email] => sadsad@sasa.com
  18.         )
  19.  
  20.     [3] => Array
  21.         (
  22.             [nombre] => Rararara
  23.             [email] => juancito.socotroco@testmail.com
  24.         )
  25.  
  26. )

Según lo devuelto por el array los valores de 0, 1 y 2 tienen los datos correctos, pero el número 3 ya no.

Estuve varias horas tratando de resolver esta situación pero no pude llegar a nada concreto. Espero que alguien me pueda iluminar el camino jaja.

Desde ya, gracias.
  #2 (permalink)  
Antiguo 27/02/2013, 01:16
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Ordenar 2 array en 1

1- Ordena la consulta por id y value "ORDER BY id, value"
2- Crea un sólo array, con índice de acuerdo a object_sid

Código PHP:
Ver original
  1. $registros = array();
  2. while(/* lectura de cada registro de la consulta */) {
  3.     // Estoy suponiendo que las variables son los campos de tu tabla
  4.     // Primero verificas que exista el índice en el arreglo
  5.     if( !isset($registros[$object_sid])) {
  6.         // No existe, la creas en blanco
  7.         $registros[$object_sid] = array('nombre' => '', 'email' => '');
  8.     }
  9.     // Ahora sólo vas agregando nombre o correo, segun el caso
  10.     if($id == 'referencia_comp:nombre_ref') {
  11.          $registros[$object_sid]['nombre'] = $value;
  12.     } else {
  13.          $registros[$object_sid]['email'] = $value;
  14.     }
  15. }

Con eso ya te quedaría el array correcto, pero en vez de ID 0, 1, 2 y 3, serán los números correspondientes de object_sid

Supongo que algo tendrás planeado hacer con los registro que tienen value vacío.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 27/02/2013, 07:10
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Ordenar 2 array en 1

Muchas gracias por la respuesta, me sirvió!

El código como lo dejé:

Código PHP:
Ver original
  1. $array = array();
  2.  
  3. foreach ($this->userData as $k)
  4. {
  5.     if (empty($k['value']))
  6.         continue;
  7.    
  8.     if ($k['id'] == 'referencia_comp:nombre_ref')
  9.         $array[$k['object_sid']][$k['complex_enum']]['nombre'] = $k['value'];
  10.     else   
  11.         $array[$k['object_sid']][$k['complex_enum']]['email'] = $k['value'];
  12. }

Nuevamente te agradezco. Doy como solucionado el tema.

Etiquetas: mysql, resultados, select
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 05:13.