Foros del Web » Programando para Internet » PHP »

Juntando Whiles

Estas en el tema de Juntando Whiles en el foro de PHP en Foros del Web. Hola a todos! FAVOR LEER BIEN TODO EL MENSAJE ANTES DE RESPONDER Estoy haciendo una encuesta que tiene 52 preguntas. A dichas preguntas se les ...
  #1 (permalink)  
Antiguo 02/04/2004, 13:55
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
De acuerdo Juntando Whiles

Hola a todos!

FAVOR LEER BIEN TODO EL MENSAJE ANTES DE RESPONDER

Estoy haciendo una encuesta que tiene 52 preguntas. A dichas preguntas se les puede responder SI o NO. Luego que el usuario las responde un script PHP procesa la encuesta y genera resultados. Pero... (nunca puede faltar un pero), no es tan fácil como parece. La encuesta está organizada por grupos de preguntas; por ejemplo de la 1 a la 5 es el grupo OBSERVACION; de la 6 a la 11 es el grupo COMPARACION ... y asi varios grupos.

Los resultados se muestran en base a los SI respondidos. Pero, los SI son inclusivos jerárquicamente, esto quiere decir que en el grupo OBSERVACION no puedo responder SI a la pregunta 1 y 4 y colocar NO en la 2 y 3. Por lo tanto, si eso llegara a ocurrir, el sistema toma únicamente el primer SI. Veamos el código:

Código PHP:
$i=1;
while((
$i<=5) && ($_POST[$i] == "si")){
  
$observacion++;
  
$i++;
}
$i=6;
while((
$i<=10) && ($_POST[$i] == "si")){
  
$comparacion++;
  
$i++;
}
$i=11;
while((
$i<=16) && ($_POST[$i] == "si")){
  
$relacion++;
  
$i++;
}
$i=17;
while((
$i<=23) && ($_POST[$i] == "si")){
  
$clasificacion++;
  
$i++;
}
$i=24;
while((
$i<=28) && ($_POST[$i] == "si")){
  
$ordenamiento++;
  
$i++;
}
$i=29;
while((
$i<=33) && ($_POST[$i] == "si")){
  
$jerarquica++;
  
$i++;
}
$i=34;
while((
$i<=37) && ($_POST[$i] == "si")){
  
$analisis++;
  
$i++;
}
$i=38;
while((
$i<=41) && ($_POST[$i] == "si")){
  
$sintesis++;
  
$i++;
}
$i=42;
while((
$i<=47) && ($_POST[$i] == "si")){
  
$evaluacion++;
  
$i++;
}
$i=48;
while((
$i<=48) && ($_POST[$i] == "si")){
  
$tconciencia++;
  
$i++;
}
$i=49;
while((
$i<=52) && ($_POST[$i] == "si")){
  
$evaluacionmet++;
  
$i++;

¿Un poco largo no?. Ese código hace exactamente lo que deseo. Comienza a contar los "SI" de cada intervalo con un WHILE y cuando se encuentra con un "NO" detiene la ejecución y salta al otro intervalo para hacer el mismo procedimiento.

Luego realizaré la otra parte del script que dependiendo de la cantidad de "SI's" consecutivos que hayan por intérvalo entonces se dará una respuesta determinada.

Mi pregunta es: ¿Hay alguna forma de hacer ese código más simple y compacto?. Señores, me he dado duro en la cabeza pero no puedo compactarlo más. Si alguno tiene alguna idea, pues será bien recibida.

Muchas gracias y saludos!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #2 (permalink)  
Antiguo 02/04/2004, 15:54
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Respuesta: arrays y funciones. Seria algo como:
Código PHP:
function sies($grupo) {
  
$si=0;
  for(
$i=$grupo['inicio'];('si'==$_POST[$i]) && ($i<=$grupo['final']);$i++) {
    
$si++;
  }
  return 
$si;
}

$grupos=array(
  
'observacion'=>array('inicio'=>1,'final'=>5,'sies'=>0),
'comparacion'=>array('inicio'=>6,'final'=>10,'sies'=>0)
);

foreach(
$grupos as $indice=>$grupo) {
  
$grupos[$indice]['sies']=sies($grupo);

Bueno, creo que estara bien. En el array añades los grupos. Y la funcion sies() devuelve el numero de los primeros sies del intervalo definido en el grupo.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 03/04/2004 a las 09:17
  #3 (permalink)  
Antiguo 02/04/2004, 19:52
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
josemi... disculpa la ignorancia, pero sinceramente no entiendo muy bien el code. Se qué significa cada cosa, pero no tengo muy claro qué funciones tiene cada proceso. Si no es mucha molestia ¿me explicas? Es que quiero aprender eso.

Saludos y gracias!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #4 (permalink)  
Antiguo 02/04/2004, 22:40
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
Hm... una cosita ¿Qué array multidimensional contiene la cantidad de sies resultantes?. Traté de hacer un echo a $grupos[observacion][sies] pero no me devuelve nada.

Saludos.
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #5 (permalink)  
Antiguo 03/04/2004, 09:16
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Bueno, es que tiene un bug (lo que me pasa por no probar el codigo). Se me olvido devolver el valor en la funcion. Aqui va el codigo correcto de la funcion:
Código PHP:
function sies($grupo) {

  
$si=0;

  for(
$i=$grupo['inicio'];('si'==$_POST[$i]) && ($i<=$grupo['final']);$i++) {

    
$si++;

  }

  return 
$si;


(tambien lo corrigo en el otro).

El codigo es como el tuyo original, pero sacando el codigo que se repite (los while) a una funcion. En la funcion uso un for en lugar del while, pero se podria usar el mismo while qu eusabas tu. Luego uso un array para ir almacenando los grupos, y aprovecharme de las funciones de recorrido de arrays.

Y con la correccion del bug ahora si en $grupos['observacion']['sies'] esta el valor calculado en la funcion.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 03/04/2004, 14:52
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
Bueno voy a probarlo. De verdad muchas gracias josemi. Cualquier cosa pego un grito! Saludos!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #7 (permalink)  
Antiguo 03/04/2004, 15:09
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
josemi...¿por qué utilizas para los arrays comillas simples?

Tu colocas:

Código PHP:
$grupos['observacion']['sies'
¿No es lo mismo colocar?
Código PHP:
$grupos[observacion][sies
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #8 (permalink)  
Antiguo 03/04/2004, 15:11
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
Ya fue probado, realmente funciona perfecto y se NOTA SIGNIFICATIVAMENTE la velocidad de procesamiento adquirida. Con los WHILES tardaba unos 2 segundos en procesar. Con esa función es inmediato.

Mil gracias josemi!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #9 (permalink)  
Antiguo 04/04/2004, 09:23
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Cita:
Mensaje Original por drcyber
josemi...¿por qué utilizas para los arrays comillas simples?

Tu colocas:

Código PHP:
$grupos['observacion']['sies'
¿No es lo mismo colocar?
Código PHP:
$grupos[observacion][sies
No, no es lo mismo. Coloca un:
Código PHP:
error_reporting(E_ALL); 
al comienzo del script y prueba las dos formas.

Sin las comillas, observacion es para PHP el nombre de una constante. Pero como no encuentra ninguna constante con ese nombre, supone que querias poner la cadena con comillas. Da un notice y la trata como una cadena.

Otro ejemplo:
Código PHP:
define('sies','noes');
echo 
'Sin comillas: '.$grupos[observacion][sies].'<br>';
echo 
'Con comillas: '.$grupos['observacion']['sies'].'<br>'
Y sobre la velocidad, en principio deberia ser la misma, o un poco mas lenta.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #10 (permalink)  
Antiguo 04/04/2004, 12:07
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 21 años, 8 meses
Puntos: 2
¿Entonces cuando debo usar comillas y cuando no?...

¿Debo usar comillas siempre en los arrays? ¿Y en los arrays superglobales?

Saludos.
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #11 (permalink)  
Antiguo 04/04/2004, 15:24
Avatar de Gerald  
Fecha de Ingreso: julio-2003
Mensajes: 1.356
Antigüedad: 20 años, 9 meses
Puntos: 2
Este manual llamado FAQ del Echo te puede servir

http://www.php-hispano.net/archivos/FAQs/140/
__________________
Solo por Hoy: Trataré de fortalecer mi mente. Estudiaré y aprenderé algo útil
Hoteldipity
Arte Caracol
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 18:48.