Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ordenar array por claves (iguales) y combinarlos en el mismo PHP

Estas en el tema de Ordenar array por claves (iguales) y combinarlos en el mismo PHP en el foro de PHP en Foros del Web. Holaa que tal queridos compañeros! Queria pedir una ayuda para ordenar mi array ya que estoy un poco confundido (perdido) de como hacerlo.. Obtengo el ...
  #1 (permalink)  
Antiguo 20/09/2014, 17:20
Avatar de nibollo  
Fecha de Ingreso: julio-2012
Mensajes: 22
Antigüedad: 12 años, 4 meses
Puntos: 2
Pregunta Ordenar array por claves (iguales) y combinarlos en el mismo PHP

Holaa que tal queridos compañeros! Queria pedir una ayuda para ordenar mi array ya que estoy un poco confundido (perdido) de como hacerlo..

Obtengo el array que son varios y lo almaceno en uno, todo por una multiple consulta :

Código PHP:
    private function superArray() {
        if (
$this->get_request_method() != "GET") {
            
$this->response(''406);
        }
        
        
$query "SELECT ..;
                            SELECT ..;
                            SELECT ..;"
;
        
        
/* Ejecutar multi consulta */
        
if ($this->db->multi_query($query)) {
            do {
                
$result_a = array();
                if (
$result $this->db->store_result()) {
                    while (
$row $result->fetch_array(MYSQLI_ASSOC)) {
                        
$result_a[] = $row;
                    }
                    
$resultado[] =$result_a++; 
                    
$result->free();
                }
            } while (
$this->db->next_result());
        }
                
print_r($resultado);
    } 
Salida :

Código array:
Ver original
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => Array
  6.                 (
  7.                     [c_id] => 1
  8.                     [c_areas] => Biomateriales
  9.                 )
  10.  
  11.             [1] => Array
  12.                 (
  13.                     [c_id] => 2
  14.                     [c_areas] => Charla
  15.                 )
  16.  
  17.             [2] => Array
  18.                 (
  19.                     [c_id] => 3
  20.                     [c_areas] => Ciclo de Actividades
  21.                 )
  22.  
  23.         )
  24.  
  25.     [1] => Array
  26.         (
  27.             [0] => Array
  28.                 (
  29.                     [a_fecha] => 23-9
  30.                     [c_id] => 1
  31.                 )
  32.  
  33.             [1] => Array
  34.                 (
  35.                     [a_fecha] => 25-9
  36.                     [c_id] => 1
  37.                 )
  38.  
  39.             [2] => Array
  40.                 (
  41.                     [a_fecha] => 23-9
  42.                     [c_id] => 2
  43.                 )
  44.  
  45.         )
  46.  
  47.     [2] => Array
  48.         (
  49.             [0] => Array
  50.                 (
  51.                     [c_id] => 1
  52.                     [a_fecha] => 23-9
  53.                     [a_inicio] => 14:00
  54.                     [a_fin] => 14:30
  55.                     [a_lugar] => Aula B01
  56.                     [a_area] => Biomateriales
  57.                     [a_tema] => Trabajos de Investigacion
  58.                     [a_disertante] => Ing. Quimica , M.Sc.
  59.                     [a_institucion] => Facultad Nacional
  60.                     [a_id] => 30
  61.                 )
  62.             [1] => Array
  63.                 (
  64.                     [c_id] => 1
  65.                     [a_fecha] => 25-9
  66.                     [a_inicio] => 14:00
  67.                     [a_fin] => 14:30
  68.                     [a_lugar] => Aula B01
  69.                     [a_area] => Biomateriales
  70.                     [a_tema] => Trabajos de Investigacion
  71.                     [a_disertante] => Ing. Quimica , M.Sc.
  72.                     [a_institucion] => Facultad Nacional
  73.                     [a_id] => 30
  74.                 )
  75.  
  76.         )
  77.  
  78. )

A lo que quiero llegar :S ...

Código Array Meta:
Ver original
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => Array
  6.                 (
  7.                     [c_id] => 1
  8.                     [c_areas] => Biomateriales
  9.                     [23-9] => Array
  10.                             (
  11.                             [a_fecha] => 23-9
  12.                             [a_inicio] => 14:00
  13.                             [a_fin] => 14:30
  14.                             [a_lugar] => Aula B01
  15.                             [a_area] => Biomateriales
  16.                             [a_tema] => Trabajos de Investigacion
  17.                             [a_disertante] => Ing. Quimica , M.Sc.
  18.                             [a_institucion] => Facultad Nacional
  19.                             [a_id] => 30
  20.                             )
  21.                     [25-9] => Array
  22.                             (
  23.                             [a_fecha] => 25-9
  24.                             [a_inicio] => 14:00
  25.                             [a_fin] => 14:30
  26.                             [a_lugar] => Aula B01
  27.                             [a_area] => Biomateriales
  28.                             [a_tema] => Trabajos de Investigacion
  29.                             [a_disertante] => Ing. Quimica , M.Sc.
  30.                             [a_institucion] => Facultad Nacional
  31.                             [a_id] => 30
  32.                             )
  33.                 )
  34.  
  35.             [1] => Array
  36.                 (
  37.                     [c_id] => 2
  38.                     [c_areas] => Charla
  39.                     [23-9] => Array
  40.                             (
  41.                             )
  42.                 )
  43.  
  44.             [2] => Array
  45.                 (
  46.                     [c_id] => 3
  47.                     [c_areas] => Ciclo de Actividades
  48.                 )
  49.  
  50.         )
  51.  
  52. )

Si a alguien le resulta facil porfavor una manito me seria de mucha ayuda!! :3 Gracias! :D

Última edición por nibollo; 20/09/2014 a las 17:27
  #2 (permalink)  
Antiguo 21/09/2014, 01:17
 
Fecha de Ingreso: marzo-2011
Ubicación: Oaxaca
Mensajes: 252
Antigüedad: 13 años, 8 meses
Puntos: 17
Respuesta: Ordenar array por claves (iguales) y combinarlos en el mismo PHP

Hola amigo, si que estas haciendo algo un poco complejo

después de leer, leer, leer y releer tu resultado con el resultado deseado, ya me di una idea de la forma como tienes tus tablas

en fin, antes de empezar, voy a dejar indicado como están tus tablas y como se relacionan para que la explicación sea mas facil (o al menos pueda entender mejor lo que estoy escribiendo antes de postearlo )

Bueno, tu tienes 3 tabalas (les pondre un nombre, puede que tu les pongas otro, pero lo dejo asi para ejemplificar )

Areas(id, Nombre);
Calendario (id_Area, Fecha);
Evento(ID, id_Area, Fecha, Hora_Inicio, Hora_Fin, Lugar, Area, Tema, Disertante, Institución );


asi ya esta un poco mas claro, ya se que la tabla áreas se relaciona con la tabla calendario y que la tabla evento se relaciona con ambas.

suponiendo que tienes asi tus tablas, yo haría 3 consultas por separado y con dependencia una dentro de la otra.

no estoy muy familiarizado con la forma como lo programaste, pero lo intentare hasta donde mis conocimientos y mi capacidad para interpretar lo que dice en la documentacion de "php.net" me lo permita, yo lo resolvería de la siguiente forma:

Código PHP:
$consulta1 "SELECT * FROM Area";
$resultado1 $mysqli->query($consulta1);
while (
$fila1$resultado1->fetch_array(MYSQLI_ASSOC)) {
   
//asignamos los valores a unas variables//
   
$ID_Area $fila1['id'];
   
$Nombre_Area $fila1['Nombre'];
   
//Mostramos los datos de la 1er consulta//
   
echo $ID_Area;
   echo 
"<br>";
   echo 
$Nombre_Area;
   echo 
"<br>";
   
//Hacemos una 2da consulta, aplicando un where//
   
$consulta2 "SELECT * FROM CalendarioWHERE id_Area =".{'$ID_Area'};
   
//Observa que usamos la variable $ID_Area que mostramos con el 'echo'//
   
$resultado2 $mysqli->query($consulta2);
   
//hacemos un 2do while//
         
while ($fila2$resultado2->fetch_array(MYSQLI_ASSOC)) {
            
//asignamos los valores a unas variables//
           
$Fecha $fila2['Fecha'];
          
//Mostramos los datos de la 2da consulta//
          
echo "       ".$Fecha;
          echo 
"<br>";
         
//Hacemos una 3ra consulta, aplicando un where//
         
$consulta3 "SELECT * FROM Evento WHERE id_Area =".{'$ID_Area'}."AND Fecha =".{'$Fecha'};
         
//Observa que usamos la variable $ID_Area y $Fecha que mostramos con el 'echo'//
         
$resultado3 $mysqli->query($consulta3);
         
//hacemos un 3er while//
               
while ($fila3$resultado3->fetch_array(MYSQLI_ASSOC)) {
                      
//asignamos los valores a unas variables//
                      
$FechaF $fila3['Fecha'];
                      
$Hora_Inicio $fila3['Hora_Inicio'];
                      
$Hora_Fin $fila3['Hora_Fin'];
                      
$Lugar $fila3['Lugar'];
                      
$Area $fila3['Area'];
                      
$Tema $fila3['Tema'];
                      
$Disertante $fila3['Disertante'];
                      
$Institución  $fila3['Institución '];
                      
//Mostramos los resultados//
                     
echo"             ".$FechaF;
                     echo 
"<br>";
                     echo
"             ".$Hora_Inicio ;
                     echo 
"<br>";
                     echo
"             ".$Hora_Fin ;
                     echo 
"<br>";
                     echo
"             "$Lugar;
                     echo 
"<br>";
                     echo
"             "$Area;
                     echo 
"<br>";
                     echo
"             ".$Tema;
                     echo 
"<br>";
                     echo
"             ".$Disertante;
                     echo 
"<br>";
                     echo
"             ".$Institución;
                     echo 
"<br>";
              }
//Fin del 3er ciclo while//
     
}//Fin del 2do ciclo while//
}//Fin del 1er ciclo while// 
Con eso deberías tener el resultado deseado, espero que te sirva amigo, cualquier duda, comenta

Última edición por juangemelo01; 21/09/2014 a las 01:41
  #3 (permalink)  
Antiguo 21/09/2014, 12:11
Avatar de nibollo  
Fecha de Ingreso: julio-2012
Mensajes: 22
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Ordenar array por claves (iguales) y combinarlos en el mismo PHP

Holaaas! antes que nada quisiera agradecer que me hayas respondido!!!!.. Me parecio muy interesante en como lo resolviste la verdad que yo me complique demasiado :S :S

Lo implemente asi y casi acertaste la forma en que estan vinculadas las tablas.. jajaja :)

Código PHP:
Ver original
  1. private function superArray() {
  2.         if ($this->get_request_method() != "GET") {
  3.             $this->response('', 406);
  4.         }
  5.         $result  = array();
  6.         $query_0 = "SELECT c_id, c_areas
  7.            FROM tbl_areas
  8.            ORDER BY c_id ASC";
  9.         $sql_0 = $this->db->query($query_0);
  10.         while ($row_0 = $sql_0->fetch_array(MYSQLI_ASSOC)) {
  11.             $c_areas = $row_0['c_areas'];
  12.             $query_1 = "SELECT DISTINCT a_fecha
  13.                      FROM tbl_activities c
  14.                      INNER JOIN tbl_areas d on d.c_areas = c.a_area
  15.                      WHERE c.a_area = '$c_areas' ORDER BY c.a_area ASC";
  16.             $sql_1 = $this->db->query($query_1);
  17.             while ($row_1 = $sql_1->fetch_array(MYSQLI_ASSOC)) {
  18.                 $dias    = array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
  19.                 $a_fecha = $row_1['a_fecha'];
  20.  
  21.                 $date  = new DateTime($row_1['a_fecha'] . '-2014');
  22.                 $mmpp  = $date->format('Y-m-d');
  23.                 $fecha = $dias[date('N', strtotime($mmpp)) - 1];
  24.                 $rem   = array('a_fecha' => $fecha);
  25.                 $row_1 = array_replace($row_1, $rem);
  26.                 $row_1 = array_flip($row_1);
  27.  
  28.                 $query_2 = "SELECT a_fecha,a_inicio,a_fin,a_lugar,a_area,a_tema,a_disertante,a_institucion,a_id
  29.                         FROM tbl_activities c
  30.                         INNER JOIN tbl_areas d ON d.c_areas = c.a_area
  31.                         WHERE c.a_area =  '$c_areas' AND c.a_fecha = '$a_fecha'
  32.                         ORDER BY c.a_area ASC";
  33.  
  34.                 $sql_2 = $this->db->query($query_2);
  35.                 while ($row_2 = $sql_2->fetch_array(MYSQLI_ASSOC)) {
  36.                     $rem      = array($fecha => [$row_2]);
  37.                     $row_1    = array_replace($row_1, $rem);
  38.                     $result[] = $row_0+$row_1;
  39.                 }
  40.             }
  41.         }
  42.         print_r($result);
  43.     }

lo hice asi y casi casi casi casi casi salio perfecto, antes de subirlo aca estuve unas 10 horas intentando realizarlo de la otra manera, no crei que seria tan sencillo con tu ayuda :)

Código Array:
Ver original
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [c_id] => 1
  6.             [c_areas] => Biomateriales
  7.             [Martes] => Array
  8.                 (
  9.                     [0] => Array
  10.                         (
  11.                             [a_fecha] => 23-9
  12.                             [a_inicio] => 16:00
  13.                             [a_fin] => 16:45
  14.                             [a_lugar] => Aula B01
  15.                             [a_area] => Biomateriales
  16.                             [a_tema] => PolÃ*tica Nacional de CTI
  17.                             [a_disertante] => Ing. QuÃ*mica Mónica Casanueva
  18.                             [a_institucion] => Consejo Nacional de Ciencia y TecnologÃ*a - CONACYT
  19.                             [a_id] => 3
  20.                         )
  21.  
  22.                 )
  23.  
  24.         )
  25.  
  26.     [1] => Array
  27.         (
  28.             [c_id] => 1
  29.             [c_areas] => Biomateriales
  30.             [Jueves] => Array
  31.                 (
  32.                     [0] => Array
  33.                         (
  34.                             [a_fecha] => 25-9
  35.                             [a_inicio] => 14:30
  36.                             [a_fin] => 15:00
  37.                             [a_lugar] => Aula B01
  38.                             [a_area] => Biomateriales
  39.                             [a_tema] => Cromo Hexavalente en la industria: Precauciones y método de
  40. depuración
  41.                             [a_disertante] => Univ. Aquino Valdovinos
  42.                             [a_institucion] => Facultad Nacional
  43.                             [a_id] => 26
  44.                         )
  45.  
  46.                 )
  47.  
  48.         )
  49.  
  50.     [2] => Array
  51.         (
  52.             [c_id] => 1
  53.             [c_areas] => Biomateriales
  54.             [Jueves] => Array
  55.                 (
  56.                     [0] => Array
  57.                         (
  58.                             [a_fecha] => 25-9
  59.                             [a_inicio] => 15:30
  60.                             [a_fin] => 16:00
  61.                             [a_lugar] => Aula B01
  62.                             [a_area] => Biomateriales
  63.                             [a_tema] => Horno a Inducción para la fundición de metales
  64.                             [a_disertante] => Univ. Hugo Armando
  65.                             [a_institucion] => Materiales y GIEM -
  66.                             [a_id] => 27
  67.                         )
  68.  
  69.                 )
  70.  
  71.         )

Pero, hay un pero :S sera que no se podria combinar de esta manera?

Código Array :s:
Ver original
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [c_id] => 1
  6.             [c_areas] => Biomateriales
  7.             [Martes] => Array
  8.                 (
  9.                     [0] => Array
  10.                         (
  11.                             [a_fecha] => 23-9
  12.                             [a_inicio] => 16:00
  13.                             [a_fin] => 16:45
  14.                             [a_lugar] => Aula B01
  15.                             [a_area] => Biomateriales
  16.                             [a_tema] => PolÃ*tica Nacional
  17.                             [a_disertante] => Ing. Casanueva
  18.                             [a_institucion] => Consejo Nacional de Ciencia y TecnologÃ*a -
  19.                             [a_id] => 3
  20.                         )
  21.            [Jueves] => Array
  22.                 (
  23.                     [0] => Array
  24.                         (
  25.                             [a_fecha] => 25-9
  26.                             [a_inicio] => 14:30
  27.                             [a_fin] => 15:00
  28.                             [a_lugar] => Aula B01
  29.                             [a_area] => Biomateriales
  30.                             [a_tema] => Cromo Hexavalente en la industria: Precauciones y método de
  31. depuración
  32.                             [a_disertante] => Univ. Aquino Valdovinos
  33.                             [a_institucion] => Facultad Holi
  34.                             [a_id] => 26
  35.                         )
  36.  
  37.  
  38.                 )
  39.  
  40.         )

Osea, que los dias esten juntos.. No puedo encontrar una manera de simplificar la salida(por la c_id y c_area)? :S Gracias :))

Y disculpa que plantee problemas muy complejos :v jajajj

Última edición por nibollo; 21/09/2014 a las 12:17
  #4 (permalink)  
Antiguo 21/09/2014, 15:19
 
Fecha de Ingreso: marzo-2011
Ubicación: Oaxaca
Mensajes: 252
Antigüedad: 13 años, 8 meses
Puntos: 17
Respuesta: Ordenar array por claves (iguales) y combinarlos en el mismo PHP

Hola amigo, no te preocupes, me gustan los problemas complejos de este tipo, son como rompecabezas para mi

la única forma que se me ocurre es que incorpores en tu base de dato un campo que tenga el día de la semana (claro, en la tabla Evento, en este ejemplo lo llamare como DiaSemana)

y dentro del segundo while, incorporas lo siguiente

Código PHP:
$contador 1;//Este contador lo usaremos para un ciclo while de 7 dias //
 
while ($contador <= 7) {
//usamos un swich para seleccionar el dia de la semana//
          
switch ($contador) {
              case 
1:
                 
$Dia "Lunes";
                 break;
             case 
2:
                 
$Dia "Martes";         
                 break;
            case 
3:
                 
$Dia "Miercoles";
                 break;
             case 
4:
                 
$Dia "Jueves";         
                 break;
            case 
5:
                 
$Dia "Viernes";
                 break;
             case 
6:
                 
$Dia "Sabado";         
                 break;
             case 
7:
                 
$Dia "Domingo";         
                 break;
//En este caso, no vamos a mostrar ningun valor de la variable aqui, la mostraremos en el siguiente ciclo//

 //Hacemos una 3ra consulta, aplicando un where//
         
$consulta3 "SELECT * FROM Evento WHERE id_Area =".{'$ID_Area'}."AND Fecha =".{'$Fecha'}."AND DiaSemana =".{'$Dia'} ;

         
$resultado3 $mysqli->query($consulta3);
 while (
$fila3$resultado3->fetch_array(MYSQLI_ASSOC)) {
                      
//asignamos los valores a unas variables//
                      
$FechaF $fila3['Fecha'];
                      
$Hora_Inicio $fila3['Hora_Inicio'];
                      
$Hora_Fin $fila3['Hora_Fin'];
                      
$Lugar $fila3['Lugar'];
                      
$Area $fila3['Area'];
                      
$Tema $fila3['Tema'];
                      
$Disertante $fila3['Disertante'];
                      
$Institución  $fila3['Institución '];
                      
//Mostramos los resultados//
                     
echo"             ".$Dia;/*********************************aqui mostramos el dia**************/
                     
echo"             ".$FechaF;
                     echo 
"<br>";
                     echo
"             ".$Hora_Inicio ;
                     echo 
"<br>";
                     echo
"             ".$Hora_Fin ;
                     echo 
"<br>";
                     echo
"             "$Lugar;
                     echo 
"<br>";
                     echo
"             "$Area;
                     echo 
"<br>";
                     echo
"             ".$Tema;
                     echo 
"<br>";
                     echo
"             ".$Disertante;
                     echo 
"<br>";
                     echo
"             ".$Institución;
                     echo 
"<br>";
              }
//Fin del 4to ciclo while//
}//Fin del 3er ciclo while//
}//Fin del 2do ciclo while//
.... 
intenta hacerlo asi amigo y comentas como te fue
  #5 (permalink)  
Antiguo 21/09/2014, 19:05
Avatar de nibollo  
Fecha de Ingreso: julio-2012
Mensajes: 22
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Ordenar array por claves (iguales) y combinarlos en el mismo PHP

no hombre! no he conseguido plantearlo.. estoy totalmente bloqueado :( Quisiera encontrar una manera mas facil de hacerlo y no alargarlo demasiado.. por eso buscaba una manera de simplificar, compactar, combinar el mismo array resultante por medio de claves,keys ^^.

Me imagino un foreach recorriendo el array resultante y tome los valores y los meta en otro.. es lo que mas puedo imaginarme pero no visto aun un ejemplo del como realizarlo :S y las funciones de php.. array_merge, array_intersect, array_unique no me sirven porque hablamos del mismo array..

Gracias bro encerio :DDDDD :)

Etiquetas: combinar
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:54.