Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/02/2013, 17:59
santi_
 
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.