PHP - Texto que cambia en función del día - Los incios son difíciles

 
Vista:
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 03/02/2020 22:22:50
Buenas noches a todos:
Estoy empezando a programar en php y la verdad es que me está costando bastante.
Tengo un proyecto en mente para una función web que cambie el contenido de una página en función del día.
Desde el día 17 de enero (la variable "i") cada 7 días cambia el contenido. Entonces lo que intento que haga es que al día de hoy (en formato número de 0 a 365, "z") le reste 17 (i) y lo divida entre 7 para saber que texto toca. Como sólo hay 6 diferentes e irán en bucle, para que nunca sea mayor de 6 utilizo el while para ir restando días de 6 en 6.
A lo mejor no me explico muy bien. Pero el caso es que a partir del "mayor que" en la línea 9 todo se imprime en la pantalla. Y no sé por qué.
¿Alguna idea de cual es el error?
Muchas gracias de antemano.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
function TextoCambiante(){
setlocale(LC_TIME,"es_ES");
$hoy = date("z");
  $i = 17;
  $x = intval(($hoy-$i)/7);
  do{
	   $x = ($x-6);
  }	while($x > 6);
 
if($x = 1){
  	return 'Texto 1';
	}
  elseif($x = 2){
  	return 'Texto 2';
	}
  elseif($x = 3){
  	return 'Texto 3';
	}
  elseif($x = 4){
  	return 'Texto 4';
	}
  elseif($x = 5){
  	return 'Texto 5';
	}
  elseif($x = 6){
  	return 'Texto 6';
	}
 }
TextoCambiante();
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Julio (830 intervenciones) el 03/02/2020 22:45:34
Hola.

Revisa las condiciones de tus if y elseif. Estás asignando con un = en vez de hacer la comparación de igualdad con == o ===, por eso se imprimen todos.

Si estás empezando en PHP y te cuesta, si quieres pásate por mi blog en Programación Básica, que intento ayudar desde un inicio simple y cercano. Estaría encantado de tener un nuevo usuario por allí. Cada semana añado dos o tres artículos nuevos y retos para practicar.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 04/02/2020 07:38:01
Hice la prueba pero sigue imprimiendo todo a partir del ">" en el "while($x > 6);"
El problema tiene que estar ahí pero no sé cual es...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Julio (830 intervenciones) el 04/02/2020 09:02:49
Hola.

Vale, ya he visto qué sucede. ¿Sabes bien qué está haciendo tu estructura do-while? Cuando te pasen estas cosas, siempre viene bien hacer una pequeña traza de qué va haciendo el programa en cada paso y así verás dónde no cuadran las cosas.

Primero, el problema con los == en los if está y existe, es decir, eso debes corregirlo porque había un error ahí. En segundo lugar, fíjate lo que está haciendo hoy, por ejemplo:

1. La variable $hoy contiene un 34
2. Cuando haces intval(($hoy-$i)/7) te acaba guardando en $x el valor 2, porque 34-17 = 17, que dividido entre 7 y cogiendo sólo su parte entera, es un 2
3. Ahora llegas al do-while, ¿y qué haces? Primero estás haciendo el do, es decir, entras y haces $x = ($x-6) independientemente de lo que valga $x, pues la primera vez en un do-while siempre se va a ejecutar ese código. Así pues, $x pasa a valer -4
4. Tus condiciones son todas igual a 1, a 2, a 3, a 4, a 5 y a 6. Por tanto, ninguna es igual a -4, no entra en ninguna de ellas y esa función devuelve un NULL

Así pues, es normal que te falle. Deberías utilizar un while en vez de un do-while, es decir:

1
2
3
while ($x > 6) {
  $x = $x - 6;
}

También puedes ponerlo como $x -= 6; que es más corto y utilizar la asignación con resta. En fin, que entonces lo primero que hará será el while y, como $x valía 2, no entrará a restarle 6, llegará a los if y ahí sí que entrará en el Texto 2.

De todas formas, creo que puedes hacerlo más sencillo si, en vez de date("z") utilizas date("W"). De esta forma obtienes el número de semana del año, desde el 1 hasta el 52 normalmente (hay años que varía en una semana). Así te evitas cálculos y puedes decirle que, por ejemplo, las semanas 1, 7, 13 ponga un texto, las semanas 2, 8, 14 ponga otro, etc. Existe una forma sencilla de comprobar ésto y no llenarlo todo de if elseif, por si quieres conocerla. Se realiza utilizando el operador módulo %.

Espero que te haya servido de ayuda.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 04/02/2020 19:54:29
Lo tenía con el while tal y como lo pones tu. Pero me daba error de sintaxis en el dreamweaver.
Lo he vuelto a poner así y cambién los "=" por "==" pero sigue imprimiendome todo a partir del ">".

El porqué de esta condición extraña es que el código pretende decirme qué farmacia está de guardia. Son turnos rotativos de 6 farmacias que empieza con la primera farmacia el 17 de enero y van cambiando cada viernes. Después de la sexta farmacia vuelve a tocarle a la primera. De ahí que quiera que rote de esta forma.

¿Habría alguna forma de que pudiese cambiar el "17" por la fecha y que así valiese el código aunque cambie el año?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Julio (830 intervenciones) el 04/02/2020 21:09:41
Hola.

Sí claro, podrías utilizar la fecha. Tendrías que leer bien cómo trabaja PHP con fechas, porque a veces cuesta pillarle el truco.

Dices que no te funciona todavía, ¿puedes colocar todo el código entero aquí y vemos qué sucede? Porque yo lo había probado y me iba bien a priori.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 04/02/2020 21:26:48
El código completo sería:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
function guardia(){
setlocale(LC_TIME,"es_ES");
$hoy = date("z");
  $i = 17;
  $x = intval(($hoy-$i)/7);
	while ($x > 6) {
  	$x = $x - 6;
	}
 
if($x == 1){
  	return 'Farmacia 1';
	}
  elseif($x == 2){
  	return 'Farmacia 2';
	}
  elseif($x == 3){
  	return 'Farmacia 3';
	}
  elseif($x == 4){
  	return 'Farmacia 4';
	}
  elseif($x == 5){
  	return 'Farmacia 5';
	}
  elseif($x == 6){
  	return 'Farmacia 6';
	}
 }
guardia();
?>

Y lo que me devuelve en el navegador y en el Dreamweaver es:
p
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Julio (830 intervenciones) el 04/02/2020 21:46:16
Hola.

Prueba el código en phptester y verás que está bien. Sólo un detalle, ponle al final cuando llamas a la función un echo guardia(); porque, si no, la función te devuelve texto pero no lo muestras por pantalla.

Lo que muestras que te da Dreamweaver por pantalla es como si no estuviera ejecutando nada del código PHP.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 04/02/2020 22:27:08
Muchísimas gracias!
Es cierto que funciona. No sé por qué en el Dreamweaver no. Pero ahora que sé que funciona voy a empezar a probarlo en una web real a ver si no me da problemas.

Muchísimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Julio (830 intervenciones) el 04/02/2020 22:44:21
Me alegro. Si necesitas algo más puedes preguntarlo, o pasarte por mi web, jeje.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por joel (1269 intervenciones) el 04/02/2020 08:22:55
Hola Moz, las comparaciones las tienes erroneas... en los if tienes que ser con dos iguales (==) si no , es una asignacion.

1
if($x == 1) {


En vez de utilizar el bucle para obtener el valor inferior a 6, creo que podrías utilizar el resto de la division:
1
$x=$x%6;
De esta manera, no es necesario el bucle.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Texto que cambia en función del día - Los incios son difíciles

Publicado por Moz (6 intervenciones) el 04/02/2020 19:55:54
El bucle lo necesito porqué el código pretende decirme qué farmacia está de guardia. Son turnos rotativos de 6 farmacias que empieza con la primera farmacia el 17 de enero y van cambiando cada viernes. Después de la sexta farmacia vuelve a tocarle a la primera. De ahí que quiera que rote de esta forma.
Cada número lanzaría un trozo de código con el nombre de la farmacia de guardia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar