Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Bucle foreach

Estas en el tema de Bucle foreach en el foro de PHP en Foros del Web. Hola a todos, como veran poco a poco voy armando el puzle, esto lo uso en wordpress pero es php igual, si lo mueven el ...
  #1 (permalink)  
Antiguo 03/08/2014, 21:50
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Bucle foreach

Hola a todos, como veran poco a poco voy armando el puzle, esto lo uso en wordpress pero es php igual, si lo mueven el post a donde corresponde muchas gracias asi voy aprendiendo de los moderadores.

Tengo el siguiente problema me da una lista de los profesores y estudiantes, pero duplica el contenido de ambos y no se como lograr ordenar profesores y estudiantes, mas abajo el codigo y el resultado correcto e incorrecto, espero contar con su ayuda muchas gracias.

Código PHP:

<?
global $wpdb
$table_name1 $wpdb->prefix "teacher";
$table_name2 $wpdb->prefix "student";
$sql="SELECT * FROM $table_name1, $table_name2 WHERE $table_name1.teid ORDER BY $table_name1.teid ASC";
$posts $wpdb->get_results($sql);
// Lista Profesores
foreach($posts as $post){ 
echo 
'Lista'
print(
'["'.$post->name_teacher.'"]'); 
print(
' = ');
};    
// Lista de Estudiantes
echo '['$Contador 0
foreach(
$posts as $post){ 
$Contador++; 
print(
'"'.$post->name_student.'"'); 
if (
$Contador count($posts)) 
print(
', ');
};    
echo 
'];';
?>

Código HTML:
Resultado Incorrecto:
Lista["Profesor de Química] = 
Lista["Profesor de Química] = 
Lista["Profesor de Química] = 
Lista["Profesor de Matemática"] =
Lista["Profesor de Matemática"] =
Lista["Profesor de Matemática"] =
Lista["Profesor de Filosofía"] =
Lista["Profesor de Filosofía"] =
Lista["Profesor de Filosofía"] =
["ANA", "ALDO", "ALEJANDRO", "ÁLVARO","BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ","CARINA", "CAROLINA", "CÉSAR", "CLAUDIA","ANA", "ALDO", "ALEJANDRO", "ÁLVARO","BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ","CARINA", "CAROLINA", "CÉSAR", "CLAUDIA","ANA", "ALDO", "ALEJANDRO", "ÁLVARO","BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ","CARINA", "CAROLINA", "CÉSAR", "CLAUDIA","ANA", "ALDO", "ALEJANDRO", "ÁLVARO","BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ","CARINA", "CAROLINA", "CÉSAR", "CLAUDIA"];   

Resultado Correcto:
Lista["Profesor de Química] = ["ANA", "ALDO", "ALEJANDRO", "ÁLVARO"]; 
Lista["Profesor de Matemática"] = ["BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ"]; 
Lista["Profesor de Filosofía"] = ["CARINA", "CAROLINA", "CÉSAR", "CLAUDIA"]; 

Última edición por pilucho; 03/08/2014 a las 21:55 Razón: nombres
  #2 (permalink)  
Antiguo 04/08/2014, 12:12
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: Bucle foreach

Con una sola vez que recorras los posts puedes obtener el resultado deseado:

Código PHP:
Ver original
  1. $prof = ""; // Inicializas para comparar
  2. $sep = ""; // Para separar los nombres
  3.  
  4. foreach($posts as $post) {
  5.     if($prof != $post->name_teacher) {
  6.           // Este if es para evitar un cierre al inicio de la cadena
  7.           if($prof != "") {
  8.                echo "\"];\n";
  9.           }
  10.           echo "Lista[\"{$post->name_teacher}\"] = [";
  11.           $sep = "";
  12.     }
  13.     echo "$sep\"{$post->name_student}\"";
  14.     $sep = ", ";
  15. };
  16. // Cierre al final
  17. echo "\"];\n";
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 09/08/2014, 15:32
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: Bucle foreach

Hola Triby sigue saliendo igual este es el codigo actual


Código PHP:

<?
global $wpdb
$table_name1 $wpdb->prefix "teacher";
$table_name2 $wpdb->prefix "student";
$sql="SELECT * FROM $table_name1, $table_name2 WHERE $table_name1.teid ORDER BY $table_name1.teid ASC";
$posts $wpdb->get_results($sql);
$prof ""// Inicializas para comparar
$sep ""// Para separar los nombres
 
foreach($posts as $post) { 
    if(
$prof != $post->name_teacher) {
          
// Este if es para evitar un cierre al inicio de la cadena
          
if($prof != "") {
               echo 
"\"];\n";
          }
          echo 
"Lista[\"{$post->name_teacher}\"] = [";
          
$sep "";
    }
    echo 
"$sep\"{$post->name_student}\"";
    
$sep ", ";
};
// Cierre al final
echo "\"];\n";

?>
Cita:
Iniciado por Triby Ver Mensaje
Con una sola vez que recorras los posts puedes obtener el resultado deseado:

Código PHP:
Ver original
  1. $prof = ""; // Inicializas para comparar
  2. $sep = ""; // Para separar los nombres
  3.  
  4. foreach($posts as $post) {
  5.     if($prof != $post->name_teacher) {
  6.           // Este if es para evitar un cierre al inicio de la cadena
  7.           if($prof != "") {
  8.                echo "\"];\n";
  9.           }
  10.           echo "Lista[\"{$post->name_teacher}\"] = [";
  11.           $sep = "";
  12.     }
  13.     echo "$sep\"{$post->name_student}\"";
  14.     $sep = ", ";
  15. };
  16. // Cierre al final
  17. echo "\"];\n";
  #4 (permalink)  
Antiguo 09/08/2014, 20:02
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: Bucle foreach

Ahora el error está en la consulta, si la pruebas en PhpMyAdmin verás que los resultados se duplican o no son como esperas, es mejor si usas JOIN.

Código MySQL:
Ver original
  1. SELECT students.*, teachers.*
  2. FROM students
  3. JOIN teachers ON teachers.teid = students.teid
  4. ORDER BY teachers.teid

Prueba y nos cuentas.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 09/08/2014, 21:02
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: Bucle foreach

Hola Triby el resultado ahora es asi:

Código HTML:
"ANA", "ALDO", "ALEJANDRO", "ÁLVARO","BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ","CARINA", "CAROLINA", "CÉSAR", "CLAUDIA""];
y no aparecen los profesores como que se fueron de vacaciones:

Código HTML:
Lista["Profesor de Química] = 
Lista["Profesor de Matemática"] =
Lista["Profesor de Filosofía"] =
deberia salir asi:

Código HTML:
Resultado Correcto:
Lista["Profesor de Química] = ["ANA", "ALDO", "ALEJANDRO", "ÁLVARO"]; 
Lista["Profesor de Matemática"] = ["BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ"]; 
Lista["Profesor de Filosofía"] = ["CARINA", "CAROLINA", "CÉSAR", "CLAUDIA"]; 


Cita:
Iniciado por Triby Ver Mensaje
Ahora el error está en la consulta, si la pruebas en PhpMyAdmin verás que los resultados se duplican o no son como esperas, es mejor si usas JOIN.

Código MySQL:
Ver original
  1. SELECT students.*, teachers.*
  2. FROM students
  3. JOIN teachers ON teachers.teid = students.teid
  4. ORDER BY teachers.teid

Prueba y nos cuentas.
  #6 (permalink)  
Antiguo 09/08/2014, 21:44
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: Bucle foreach

Saludos Triby gracias por el apoyo, este es el codigo actual y el resultado actual


Código PHP:

<?
global $wpdb
$table_name1 $wpdb->prefix "teacher";
$table_name2 $wpdb->prefix "student";
$sql="SELECT $table_name2.*, $table_name1.*, $table_name1.*    FROM $table_name2 JOIN $table_name1 ON $table_name1.teid = $table_name2.teid ORDER BY $table_name1.teid";
$posts $wpdb->get_results($sql);
$prof ""// Inicializas para comparar
$sep ""// Para separar los nombres
 
foreach($posts as $post) { 
    if(
$prof != $post->name_teacher) {
          
// Este if es para evitar un cierre al inicio de la cadena
          
if($prof != "") {
               echo 
"\"];\n";
          }
          echo 
"Lista[\"{$post->name_teacher}\"] = [";
          
$sep "";
    }
    echo 
"$sep\"{$post->name_student}\"";
    
$sep ", ";
};
// Cierre al final
echo "\"];\n";
?>
Resultado Actual:

Código HTML:
Lista["Profesor de Química"] = ["ANA"Lista["Profesor de Química"] = ["ALDO"Lista["Profesor de Química"] = ["ALEJANDRO"Lista["Profesor de Química"] = ["ÁLVARO"Lista["Profesor de Matemática"] = ["BÁRBARA"Lista["Profesor de Matemática"] = ["BENJAMÍN"Lista["Profesor de Matemática"] = ["BIANCA"Lista["Profesor de Matemática"] = ["BEATRIZ"Lista["Profesor de Matemática"] = ["CARINA"Lista["Profesor de Matemática"] = ["CAROLINA"Lista["Profesor de Matemática"] = ["CÉSAR""]; 
Beria salir asi:

Código HTML:
Lista["Profesor de Química] = ["ANA", "ALDO", "ALEJANDRO", "ÁLVARO"]; 
Lista["Profesor de Matemática"] = ["BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ"]; 
Lista["Profesor de Filosofía"] = ["CARINA", "CAROLINA", "CÉSAR", "CLAUDIA"]; 
  #7 (permalink)  
Antiguo 09/08/2014, 21:55
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: Bucle foreach

Antes del echo "Lista..." falta agregar $prof = $post->name_teacher;
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 10/08/2014, 00:47
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: Bucle foreach

GRACIAS Triby Ahora si funciona.

Existe una forma de ordenar el nombre de los estudiantes por que sale desordenado solo es un detalle minimo, si se pude bien.

Código PHP:

<?
global $wpdb
$table_name1 $wpdb->prefix "teacher";
$table_name2 $wpdb->prefix "student";
$sql="SELECT $table_name2.*, $table_name1.*, $table_name1.*    FROM $table_name2 JOIN $table_name1 ON $table_name1.teid = $table_name2.teid ORDER BY $table_name1.teid ASC";
$posts $wpdb->get_results($sql);
$prof ""// Inicializas para comparar
$sep ""// Para separar los nombres
 
foreach($posts as $post) { 
    if(
$prof != $post->name_teacher) {
          
// Este if es para evitar un cierre al inicio de la cadena
          
if($prof != "") {
               echo 
"];\n";
          }
          
$prof $post->name_teacher;
          echo 
"Lista[\"{$post->name_teacher}\"] = [";
          
$sep "";
    }
    echo 
"$sep\"{$post->name_student}\"";
    
$sep ", ";
};
// Cierre al final
echo "];\n";
?>
Resultado Correcto:
Código HTML:
Lista["Profesor de Química] = ["ANA", "ALDO", "ALEJANDRO", "ÁLVARO"]; 
Lista["Profesor de Matemática"] = ["BÁRBARA", "BENJAMÍN", "BIANCA", "BEATRIZ"]; 
Lista["Profesor de Filosofía"] = ["CARINA", "CAROLINA", "CÉSAR", "CLAUDIA"]; 
  #9 (permalink)  
Antiguo 11/08/2014, 03:52
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: Bucle foreach

En el ORDER BY solo agrega el segundo campo por el cual deben ordenarse los resultados, separándolo por una coma y con eso debes obtener los resultados como deseas.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 11/08/2014, 16:45
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 4 meses
Puntos: 6
Cita:
Iniciado por Triby Ver Mensaje
En el ORDER BY solo agrega el segundo campo por el cual deben ordenarse los resultados, separándolo por una coma y con eso debes obtener los resultados como deseas.
Saludos Triby este es el codigo:

Código PHP:


$sql
="SELECT $table_name2.*, $table_name1.*, $table_name1.*    FROM $table_name2 JOIN $table_name1 ON $table_name1.teid = $table_name2.teid ORDER BY $table_name1.teid, $table_name2.stid"
Muchas Gracias Triby

Última edición por Triby; 11/08/2014 a las 20:10 Razón: Combinar mensajes seguidos

Etiquetas: bucle, foreach
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 01:07.