Problema de Monty Hall. Solución demostrada con PHP


El enunciado del problema, extraído de la wikipedia que a su vez ha sido extraído de “una carta de Craig F. Whitaker a la columna de Marilyn vos Savant en Parade Magazine en 1990” reza así:

Supón que estás en un concurso, y se te ofrece escoger entre tres puertas: detrás de una de ellas hay un coche, y detrás de las otras, cabras. Escoges una puerta, digamos la nº1, y el presentador, que sabe lo que hay detrás de las puertas, abre otra, digamos la nº3, que contiene una cabra. Entonces te pregunta: “¿No prefieres escoger la nº2?”. ¿Es mejor para ti cambiar tu elección?

La solución: Dado que en un principio nuestras posibilidades de fallar eran mayores, probablemente fallasemos. Al reducir el problema descartando una de las puertas erróneas, obtenemos la puerta elegida inicialmente (la que probablemente sea la errónea) y la contraria (la que probablemente sea la correcta). Es decir, si tenemos una alta probabilidad de fallar, fallaremos. Por lo tanto, la solución a este problema es que es prudente cambiar de puerta ya que tendremos más probabilidades de acertar.

En esta escena de no se que película se explica el problema: http://www.youtube.com/watch?v=_mbO-ndr740

Aqui la entrada en la wikipedia del problema de Monty Hall: http://es.wikipedia.org/wiki/Problema_de_Monty_Hall

Y para los que se aburran: http://es.wikipedia.org/wiki/Teorema_de_Bayes

Y ahora, el código PHP que lo demuestra:

<?php

/*****Sin cambiar de puerta******/
$puertas=array(1=>'cabra', 2=>'coche', 3=>'cabra');
$aciertos=0;

for($i=0;$i!=10;$i++){
     $puerta_elegida=rand(1,3);
     // ya que en ningun momento vamos a cambiar de puerta, si acertamos a la primera,
     // apuntamos acierto. Si no acertamos, no se hace nada.
    if($puertas[$puerta_elegida] == "coche"){ $aciertos++; }
}
echo "Aciertos sin cambiar de puerta: $aciertos/10 <br />\n";

/******Cambiando de puerta*****/
$aciertos=0;

for($i=0;$i!=10;$i++){
     $puerta_elegida=rand(1,3);

     foreach($puertas as $key => $valor){ //recorremos el array
         //determinamos la puerta a eliminar
         if($key != $puerta_elegida && $valor == "cabra"){ $puerta_eliminada=$key; }
     }

     //detectamos la puerta contraria a la elegida de las dos que nos quedan
     foreach($puertas as $key => $valor){
         if($key != $puerta_elegida && $key != $puerta_eliminada){
        //si la puerta a la que cambiamos es un coche, apuntamos acierto
             if($puertas[$key] == "coche"){ $aciertos++; }
         }
     }
}
echo "Aciertos cambiando de puerta: $aciertos/10 <br />\n";

?>

Este script realiza 10 veces el problema en cada caso, tanto sin cambiar de puerta (la primera porción) como cambiando de puerta (la segunda porción). Ejecutando el script diez veces, obtengo estos resultados:

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 6/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 10/10

Aciertos sin cambiar de puerta: 7/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 5/10
Aciertos cambiando de puerta: 6/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 9/10

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 9/10

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 10/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 5/10

Queda demostrado pues, que cambiar de puerta es la elección correcta.

Actualización [20/05/2010]:  Me comenta Jony que la escena de la película (el enlace a youtube) es en realidad una escena de la serie Numb3rs (http://www.imdb.com/title/tt0433309/). Gracias por la corrección x).

Consultorio PHP, recogida de preguntas


Como ya no se que más explicar de PHP de lo que se supone que debemos saber para el examen de la primera evaluación, dejo este post para que en los comentarios dejeis las preguntas sobre lo que más duda tengais. Preguntas sobre sintáxis, sobre conceptos o métodos para resolver problemas, lo que os venga en gana preguntar.

De modo que si quereis que explique alguna cosa o profundice en otra, dejad un comentario y lo resolveré.

Consultorio nache a la ecucha x)

Conceptos básicos de PHP (5)


Ya estoy de vuelta, esta vez para explicar cómo funcionan los formularios. Trataré de explicarlo de una forma clára.

Cuando creamos una página, lo interesante llega cuando permitimos al usuario interactuar con la página, y mostrar resultado según los valores que dicho usuario introduzca mediante unos campos que permiten escribir. Cuando entramos en google, éste nos brinda un campo de formulario con un espacio para escribir nuestra busqueda y uno o dos botones que envían nuestra petición. Al darle al botón, los valores introducidos se envían a otra página escrita en php que trata estos valores para mostrar un resultado. Vamos a tratar de entender cómo son enviados los valores para su posterior tratado en php.

Primero creamos una archivo HTML, que contenga los campos de formularios que serán enviados a otro archivo en php. Algo básico:

<html>
<head><title>Ejemplillo</title></head>
<body>
<form action="paginaenphp.php" method="post" >
<input type="text" name="valor1" />
<input type="submit" value="Enviar" />

</form>

</body>

</html>

Hemos creado una etiqueta <form>, donde le decimos a que página se enviarán nuestros datos (action=”paginaenphp.php”) y donde además le decimos de que forma serán enviados estos datos (method=”post”). Dentro de la etiqueta <form> hemos metido dos “input” o elementos de formularios. El primero es de tipo texto (type=”text”) que será una entrada que nos permitirá introducir texto. La segunda es de tipo submit (type=”submit”) que será un botón encargado de enviar los datos. Para que al enviar el formulario a nuestro archivo php éste sepa que variables tiene que manejar, debemos darle un nombre a cada elemento del formulario donde introduzcamos algún dato. Php recibirá un array llamado $_POST[] donde cada índice será el nombre que hemos puesto en HTML. Este nombre se especifica con name=”nombreindice”.

La forma en que se envían estos datos es similar a la forma en que se establece la conexión entre navegador y servidor web cuando escribimos una dirección. El parámetro action=”lugar” actúa como barra de direcciones, si no le especificamos la dirección completa, asume que el archivo paginaenphp.php está en el mismo sito que el archivo HTML que contiene el formulario. De este modo, podriamos realizar una conexión incluso con un servidor diferente indicandolo en action; action=”http://www.google.com/search&#8221;. Si hicieramos esto, google recibiría los datos de nuestro formulario pero no sabría que hacer con ellos ya que espera una variable $_POST con nombres de índice concretos y no nuestro $_POST[“valor1″] indicado en el input (name=”valor1”) de nuestro HTML.

Por lo tanto, podríamos decir que un formulario actua de forma similar a cuando escribimos una dirección web en la barra de direcciones de nuestro navegador, con la particularidad que a la vez que pide un archivo php, le envía unos valores para que los trate y así obtener un resultado en nuestro navegador en función a los datos enviados. Veamos como sería el archivo paginaenphp.php:

<?php
echo "El dato introducido en el formularo es: " . $_POST["valor1"];
?>

Como vemos, la variable de tipo array llamada $_POST no la hemos definido, ya que no somos nosotros quién la tenemos que definir, ésta se crea automáticamente cuando al pedir un archivo php, se envían a su vez datos de formulario. Para nuestro caso, la forma de enviar estos datos es mediante “post”, por lo tanto la variable creada automáticamente se llamará $_POST con nombres de índices iguales a los nombres de nuestros elementos de formulario y con el valor que hemos escrito en dicho elemento. Sigamos con otro ejemplo. Supongamos que creamos un formulario con dos elementos para introducir valores y un botón para enviar dichos valores. Los valores introducidos serán numeros y cuando lo enviemos a php, éste sumará los dos numeros y mostrará el resultado. Bien, al lío; creamos primero el archivo en HTML:

<html>
<head><title>Otro Ejemplillo</title></head>
<body>
<form action="archivophp.php" method="post">
     <input type="text" name="valor1" />
     <input type="text" name="valor2" />
     <input type="submit" value="Enviar" />

</form>

</body>

</html>

Hemos creado un formulario similar al anterior, la diferencia es que hemos añadido otro elemento de texto más. Veamos el archivophp.php:

<?php
$resultado=$_POST["valor1"]+$_POST["valor2"];

echo "El resultado de la suma es: " . $resultado;

?>

Bien, obtenemos automáticamente una variable de tipo array llamada $_POST con índices de nombre igual a nuestros elementos en el formulario; valor1 y valor2. En $resultado almacenamos la suma de $_POST[“valor1”] y de $_POST[“valor2”] para luego mostrarla con echo.

Una aclaración. Como podemos observar el nombre de los índices del array se entrecomillan si son de típo texto, esto crea conflictos con echo cuando no lo usamos correctamente. Esto sería incorrecto:

Mal: echo “El valor1 es: $_POST[“valor1″]”;

Recordemos: echo muestra texto desde el inicio de comillas dobles hasta que encuentra otras comillas dobles, por lo tanto al encontrar las comillas dobles iniciales del índice del array, asume que ha terminado de mostrar texto y espera un punto y coma para terminar. Pero no es lo que encuentra, en cambio encuentra: valor1″]”; Lo cual es incorrecto (error de sintáxis). De modo que para solucionar esto, sacaríamos la variable fuera de las comillas:

Bien: echo “El valor1 es: ” . $_POST[“valor1”];

Otra forma de solucionar esto sería sustituir las comillas dobles del índice por comillas simples:

Bien: echo “El valor1 es: $_POST[‘valor1’]”;

Al sustituir comillas dobles por comillas simples, no creamos ningún conflicto en el echo y al encontrar el símbolo $ asume que está ante una variable y la reemplaza por su valor.

All right, expliquemos ahora un concepto extraño. En clase hemos visto como crear un formulario en un archivo html y un archivo php que recibe los datos del formulario. Bueno, a mi particularmente me gusta meter el código php y el html en el mismo archivo. Además es lo que se hace en la vida real habitualmente. Tratemos de entender esto.

Sabemos que al enviar un formulario a un archivo php se crea una variable automáticamente llamada $_POST. Si accedieramos a ese archivo mediante la barra de direcciones de nuestro navegador, esta variable no existiría. Gracias a esta particularidad, en un archivo php podemos reconocer cuando estamos pidiendo el archivo mediante el navegador y cuando han sido enviados los datos. Para hacer este reconocimiento nos ayudaremos de nuestro amigo if else y de una función llamada isset(), a la cual le pasamos una variable como parámetro y nos devuelve un uno (1) si la variable existe y un cero (0) si la variable no existe. ¿Recordais que if esperaba un cero o un uno para ejecutar o no una porción de código? Veamos esto con un ejemplo:

<html>
<head><title>HTML y PHP todo juntito</head>
<body>
<form action="" method="post">
     <input type="text" name="valor1" />
     <input type="submit" value="Enviar" />

</form>
<?php
if( isset($_POST) ){
     echo "El formulario ha sido enviado y valor1 contiene: " . $_POST["valor1"];

}else{
     echo "Aun no se han enviado datos mediante formulario";

}

?>

</body>

</html>

Observemos, isset($_POST) comprueba si el array existe. Si existe (1) significa que hemos enviado el formulario por lo que pasamos a mostrar el valor de los datos enviados. Si no existe este array (0), significa que no hemos enviado los datos mediante formulario y muestra la porción de codigo dentro de else. Curioso ¿eh? Para indicar que queremos enviar los datos al mismo archivo, podemos poner en action el nombre del archivo o simplemente dejar este campo vacío action=””.

Para terminar, os dejo un pequeño juguetito. Hemos visto como enviar datos a un php mediante POST. Existe otro método de enviar datos a un php llamado GET. Este método añade a la dirección url escrita en nuestro navegador el nombre de un índice y su valor. La forma de hacerla sería esta: http://www.nasa.com/archivo.php?nombreindice=pepe&nombredeotroindice=perico. Analicemos esto, hemos enviado al archivo.php de la nasa un índice de variable array llamado nombreindice con valor pepe y otro índice llamado nombredeotroindice con valor perico. Observemos un enlace a un vídeo en youtube:

http://www.youtube.com/watch.php?v=rCLYx3nomao

En este enlace, estamos enviando un índice llamado v con valor rCLYx3nomao al archivo llamado watch.php. Bien, notad que tenemos el poder de darle a esta variable el valor que nos venga en gana. Y digo más, si cualquier persona puede dar una valor cualquiera a una variable dentro de un código php, ¿no sería ésto peligroso?, … pues sería, sería.

x)

Conceptos básicos de PHP (4)



Bien bien, antes de pasar a los formularios, en este artículo se van a explicar el bucle while y los arrays.

Los whiles son tambien controladores de flujo, concretamente repiten una porción de código tantas veces como nosotros le digamos. A medida que repite esta porción de código, las variables pueden ir cambiando de valor para ir mostrando resultados diferentes en cada repetición.

La sintáxis de while es idéntica a la sintáxis de if, con la particularidad de que cundo entre en la porción de código, la repetirá tantas veces como le digamos. ¿Y como se lo decimos?, pues igual que se lo decimos a if, con una condición. Esta condición se comprobará cada vez que se repita la porción de código. Por lo tanto, cuando la condición deje de ser cierta, dejará de repetir esta porción de código y seguirá examinando el resto del archivo. Veamos algunos ejemplos:

<?php
$variabledecontrol=0;
while($variabledecontrol != 20){

     $variabledecontrol++;
     echo $variabledecontrol;

}
?>

Leamos este código, que siempre viene bien para no liarnos, sobre todo con el while:

1) Mientras que $variabledecontrol no sea igual a 20, haz esto:

2) Incrementa $variabledecontrol en uno

3) Muestra el contenido actual de $variabledecontrol

Bien, es cierto que $variabledecontrol no es igual a 20, por que si lo fuera, no ejecutaría esa porción de código. Y esto es lo que ocurre cuando $variabledecontrol llega a 20 ya que va cambiando de valor en cada repetición. La primera vez que entramos en la porción de código, incrementamos su valor añadiendo ++ a su nombre, por lo que $variabledecontrol vale 1. La segunda vez, antes de entrar otra vez en la porción de código, $variabledecontrol, que vale 1, no será igual a 20 (condición cierta), por lo que seguirá repitiendo la porción de código. Esta segunda vez, volvemos a incrementar $variabledecontrol, que pasará a tener esta vez un valor de 2. Esto se repetirá una y otra vez hasta llegar a 20, donde la condición será falsa, ya que $variabledecontrol si que vale 20, por lo tanto, el interprete de php se olvida del while y sigue su camino.

Cuando carguemos la página y el php se ejecute, en nuestro navegador obtendremos algo tal que así:

1234567891011121314151617181920

El echo va ejecutando religiosamente lo que nosotros le hemos dicho, mostrar por pantalla el valor de $variabledecontrol, pero nos pone los numeritos juntos. La razón de esto es que lo único que mostramos es el número, no mostramos ningún espacio ni ningún salto de linea. Vamos a modificar el código anterior para que el resultado obtenido sea mas claro:

<?php
$variabledecontrol=0;
while($variabledecontrol != 20){
     $variabledecontrol++;
     echo $variabledecontrol . " - ";
}
?>

Hemos añadido en el echo un texto después de la variable usando un punto para separar variable de texto. Ya vimos con anterioridad las diferentes formas de uscar echo, así que esto queda al gusto del consumidor. El resultado obtenido en el navegador sería este:

1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 – 14 – 15 – 16 – 17 – 18 – 19 – 20 –

En HTML para poner un salto de linea no basta con darle al enter, el navegador básicamente se lo pasa por el forro. Si queremos mostrar un salto de línea, debemos usar la etiqueta <br> o <br />. Ambas valen para el caso que nos ocupa. por lo tanto, el echo quedaría así:

echo $variabledecontrol . ” <br />”;

El resultado en código HTML sería este:

1<br /> 2 <br /> 3 <br /> 4 <br /> 5 <br /> 6 <br /> 7 <br /> 8 <br /> 9 <br /> 10 <br /> 11 <br /> 12 <br /> 13 <br /> 14 <br /> 15 <br /> 16 <br /> 17 <br /> 18 <br /> 19 <br /> 20 <br />

Nuestro navegador interpretaría este código HTML y nos mostraría cada numero en una linea diferente.

Arrays

Pasemos ahora a los arrays. Los arrays no son mas que -a groso modo- un conjunto de variables con el mismo nombre diferenciadas por un índice. Podemos añadir y quitar tantos valores como queramos en un array. Existen muchas formas de dar valores a los arrays, me centraré sólo en unos pocos.

La sintáxis de los arrays se caracteriza por $nombrevariable[índice]. De este modo, podemos tener dos valores en una misma variable con un índice diferente:

<?php
$variable[0]="soy un texto en un array en el índice 0";
$variable[1]="soy un texto duiferente en un array en el índice 1";

echo $variable[0];
echo $variable[1];

?>

Hemos almacenado dos textos diferentes dentro de una misma variable, pero cada uno tiene su propio índice (cero y uno), por lo tanto podemos acceder a cada valor independientemente indicando ese índice.

Cuando no conocemos la cantidad de índices ni el valor de cada índice, podemos usar un bucle como while (existen formas específicas para recorrer arrays como foreach() pero no lo vamos a tratar). La forma de recorrer un array con un while, sería la siguiente:

<?php
$variable[1]="una cosa";
$variable[2]="otra cosa";
$variable[3]="mas cosas";
$variable[4]="conchinchina";
$variable[5]="pelicano";
$variable[6]="sarpullido";
$variable[7]="perico";
$variable[8]="cacafuti";
$variable[9]="guebin";
$variable[10]="zaratrusta";
$variabledecontrol="0";
while($variabledecontrol != 10){
     $variabledecontrol++;

     echo $variable[$variabledecontrol];

}
?>

Esto nos mostraría el contenido de cada índice gracias al bucle y la $variabledecontrol incrementada. En cada repetición del bucle, $variabledecontrol tiene un valor diferente, (1, 2, 3, 4…) por lo tanto, al meterla dentro de los corchetes del array, le estamos pidiendo el índice con valor igual al de la $variabledecontrol. Por lo tanto, cuando $variabledecontrol valga 5, estamos pidiendole $variable[5].

Vamos a complicar un poco esto, supongamos que tenemos el código anterior, no sabemos en que índice está el texto “pelicano” y queremos encontrarlo. Pues al lío:

<?php
$variable[1]="una cosa";
$variable[2]="otra  cosa";
$variable[3]="mas cosas";
$variable[4]="conchinchina";
$variable[5]="pelicano";
$variable[6]="sarpullido";
$variable[7]="perico";
$variable[8]="cacafuti";
$variable[9]="guebin";
$variable[10]="zaratrusta";
$variabledecontrol="0";
while($variabledecontrol  != 10){
     $variabledecontrol++;
     if ( $variable[$variabledecontrol] == "pelicano"){
          echo "pelicano se encuentra en el índice: " . $variabledecontrol;

     }
}
?>

Como ya se ha dicho, gracias a la $variabledecontrol vamos obteniendo los diferentes valores que tiene el array, cuando encontramos el valor que queremos, con la ayuda de nuestro querido if, mostramos el valor de $variabledecontrol que vale igual que el índice en el momento de encontrar nuestro valor.

Otra particularidad de los arrays es que sus indices pueden ser tanto numéricos como alfanuméricos. Cuando trabajamos con formularios, los índices de los arrays habitualmente son alfanuméricos (texto o texto y numeros). Por lo que recorrer un array con índice alfanumérico se complica. Aquií es donde entra foreach(), pero como ya se ha dicho, no lo vamos a tratar. Para definir un índice con texto, se hace entre comillas, recordad, el texto va entrecomillado. Por lo tanto:

$variable[“valor1″]=”perico”;

$variable[“valor3″]=”joselico”;

$variable[“cualquiercosa”]=9;

Como utilidad y para terminar, cuando un array nos toque las narices, podemos ver el contenido completo de un array con sus indices y sus valores gracias a una función llamada print_r():

<?php
$variable["valor1"]="perico";
$variable["valor3"]="joselico";
$variable["cualquiercosa"]=9;

print_r($variable);

?>

La función print_r() ella sola es capaz de mostrar por pantalla texto, por lo tanto no necesitamos el echo. El resultado sería algo así:

Array

(

[valor1] => perico

[valor3] => joselico

[cualquiercosa] => 9

)

Y con esto, se finí. En el próximo artículo: formularios. Talué! x)

Conceptos básicos de PHP (3)



Siguiendo con el hilo de esta serie de artículos, vamos a explicar que son los controles de flujo.

Cuando creamos un código PHP, el interprete del servidor encargado de examinarlo y ejecutarlo, lee linea por linea en busca de nuestras instrucciones. Cuando encuentra una variable en una linea, memoriza esta variable con su valor y lee la siguiente linea. Si en la segunda linea encuentra un echo, muestra por pantalla el contenido del echo; si en la tercera encuentra un “echo $variable”, recuerda el contenido de esa variable y la muestra, etc etc…

Lo interesante llega cuando queremos controlar esto, quizás nos interese que el interprete lea una linea u otra según una condición, o que repita una linea tantas veces como le digamos. Es aqui cuando llega el control de flujos brindandonos el poder de controlar lo que hace el interprete.

Controlando que linea se muestra

Una forma de controlar que linea se muestra, es con if y con if else. Supongamos que queremos mostrar el contenido de una variable si ésta contiene la palabra “cacafuti”:

<?php
$variable="cacafuti";

if ($variable == "cacafuti" )
{     
     echo "la variable contiene $cacafuti";
}
?>

Podemos observar que la variable llamada “variable” contiene el texto o cadena de caracteres “cacafuti”. El if hace una comprobación: si $variable es igual a “cacafuti” entonces… echo “la variable contiene $cacafuti”. Bien, centremonos en la condición o comprobación de si es cierto o no:

if($variable == “cacafuti”)

Cuando metemos una condición dentro de los parentesis del if(), esta comprobación envía un uno o un cero; uno es cierto, cero es falso. Por lo tanto, si $variable es igual a “cacafuti” esto se convertirá en un uno, ya que es cierto. Si nosotros metieramos un uno a secas entre esos parentesis reservados para una condición, el contenido del if se leería siempre:

<?php
if(1){     
     echo "Soy un texto dentro de un if que siempre es cierto (o uno)";
}
?>

De lo contrario, si metieramos un cero, la condición nunca sería cierta:

<?php
if(0){   
  echo "Este texto nunca será mostrado";
}
?>

¿Por qué explico esto? Para entender que lo que el if() espera es un uno (verdadero) o cero (falso) ya sea una condición con ==  (igual que), != (no igual que) o cualquier otra cosa que su resultado sea uno o cero. Por lo tanto, esto también sería correcto:

<?php
$variableA=1;
$variableB=0;
if($variableA){
   echo "Este texto será mostrado ya que variableA es uno";
}if($variableB){
   echo "este texto nunca en la vida será mostrado";
}
?>

Observese que $variableA vale o contiene un uno y $variableB vale o contiene un cero. Teniendo esto claro, podemos meter la variable a pelo dentro del if, sin condición ni nada, ya que como se ha dicho, el if espera un cero o un uno; le importa tres pepinos como lo obtenga, pero eso es lo que espera.

Pasemos ahora al if else. Cuando queremos mostrar una cosa u otra según una condición, utilizamos if else. De este modo controlamos que se muestra en función, por ejemplo, del valor que tenga una variable:

<?php
$variable="popurri";
if($variable == "popurri"){
     echo "La variable contiene la palabra popurri";
}else{
     echo "La variable no contiene popurri";}
?>

Leamos este código…

1) $variable es igual a “popurri”

2) Si $variable es igual a “popurri” entonces…

3) mostramos “La variable contiene la palabra popurri”

4) de lo contrario…

5) mostramos “La variable no contiene popurri”;

Hay que acordarse de la sintáxis del if, es decir, de como se escribe: if(condicion){codigo si la condición es cierta}. Entre parentesis la condicion y entre corchetes el código si es cierta la condición. Por lo tanto, el if al ser un controlador de flujos, no lleva punto y coma en ningún sitio, pero el código que contiene, si lo lleva; sólo lo que hay entre corchetes. Pasemos ahora a las funciones.

Funciones o metodos

Por ahora no vamos a crear funciones, vamos a trabajar con las funciones que ya vienen de fábrica en php, pero para entender cómo funciona una función, vamos a ver el código de una. La función es aquello que nos permite realizar acciones dandole un valor a ésta para que lo manipule y nos devuelva el resultado de esa manipulación. En clase hemos visto tan() arctan() y alguna mas. El echo no es una función, pero la podemos tratar como tal para no liarnos. Las funciones no son otra cosa que una porción de codigo ya hecho, el cual podemos ejecutar llamando a la función que necesitemos. Veamos una función simple para entender como funciona:

<?php
function suma($numero){
     $resultado=$numero+5;
     return $resultado;
}
?>

Bien, poco a poco… Hemos dicho que las funciones reciben un valor, lo manipulan y devuelven el resultado. La sintáxis de las funciones son iguales que el if, pero en el parentesis no se meten condiciones, en cambio se meten variables que almacenarán los parametros que nosotros le pasemos. En concreto, esta funcion suma un cinco a la variable $numero, que contendrá el valor que nosotros le pasemos, lo almacena en $resultado y nos devuelve dicho resultado. Por lo tanto, las funciones se usan así:

<?php
$valorsumado=suma(9);
?>

Observemos que 9 es el valor que le pasamos a la función para que lo manipule. Hará con este valor lo que tenga que hacer y devuelve el resultado. En concreto, la variable $valorsumado valdrá 14. Nótese que el 9 no tiene comillas, esto es por que los numeros pueden ir entrecomillados, pero no deben para evitar algunos problemas mas complejos que no voy a tratar. Sólo recordarlo: los numeros que usemos para cálculos, sin comillas.

Observar también que estamos igualando $valorsumado con suma(9) y como es lógico, un igual es un igual, por lo tanto $valorsumado y suma(9) valen lo mismo. De modo que esto sería correcto:

<?php
echo suma(9);
?>

Le decimos a echo que muestre el valor de suma(9), y el valor de suma(9) será el resultado del cálculo que hace la función. A groso modo, las funciones pueden ser tratadas como variables con la particularidad de que su valor será el resultado de una manipulación interna de la función. Y ya que esto es así, vamos a demostrarlo:

<?php
$numerico=14;
if(suma(9) == $numerico){
     echo "La variable es igual a la suma de 9 mas 5";
}
?>

Aqui hemos tratado a la función como una variable, y su valor es 14 -igual que $numerico- Por lo tanto, la condición es cierta y pasa a mostrar el echo. Ni que decir tiene que el valor que nosotros le pasamos a la función, puede ser también una variable:

<?php
$numerico=14;
if(suma($numerico) == $numerico){
     echo "La condición es cierta";
}else{
     echo "La condición es falsa";
}
?>

Bien, a suma() le pasamos el valor de $numerico, por lo que suma() vale 19 (14+5=19) y no es igual a $numerico, ya que este vale 14 por lo tanto la condición es falsa.

En PHP existen miles de funciones ya creadas y listas para usarlas nosotros, las cuales aceptan no sólo uno, sino varios parametros. Algunas hacen calculos complejos, otras buscan una palabra en un texto, otras hacen comprobaciones, y así hasta un sinfín de posibilidades. Para saber usar cualquier función, nos basta con saber que parametros debemos darle, y que resultado nos va a devolver. Nos da completamente igual lo que haga por dentro, sabiendo eso y sabiendo como manejar las funciones en nuestro código, es suficiente.

Por último y para terminar, decir que podemos mostrar la funcion usandola como variable con un echo junto con más texto, pero esto se debe hacer con un punto a cada lado:

Bien: echo “Mi periquito me costó ” . suma(14) . “centimos”;

Mal: echo “Tu periquito no vale ni suma(14) centimos”;

¿Por que? Por que el echo interpreta suma(14) como un texto normalito, total, son parentesis y un numero. Por esto hay que sacar la función fuera de las comillas, para que lo interprete como una función.

Y se finí. Para los próximos capítulos, bucles y formularios. A pasarlo bien x)

Conceptos básicos de PHP (2)



Bien, bien, bien…, en la primera entrega se explicó cómo funciona PHP, es hora de analizar su sintáxis.

1) PHP va entre las etiquetas <? … ?> o también <?php … ?> (se recomienda la segunda, pero esto queda a gusto del consumidor)

2) Cuando queramos mostrar datos (por ejemplo con “echo”), deben estar entrecomillados a no ser que sea una variable:

Bien: echo "Me gustan los lacasitos";
Mal: echo Me pica un testiculo;
Bien: echo $variable;
Mal: echo "$variable";
Bien: echo "Me pica una $variable muchisimo";
Mal: echo Me pica una $variable muchisimo;
Bien: echo "Me pica una" . $variable . "muchisimo";
Mal: echo "Tu amigo es un "$variable" de cuidado";
Bien: echo "Tu amigo es un \" $variable \" de cuidado";

El echo asume que todo lo que hay entre comilla y comilla es un texto que queremos mostrar. Si encuentra una palabra con un $ delante, asume que es una variable y la sustituye por el valor de esa variable. Poner sólo una variable entre comillas se puede hacer, pero no es correcto, y ya que nos ponemos, nos ponemos bien.  Nótese la variable con un punto a cada lado, esto le indica a echo que separe el texto normal entrecomillado de la propia variable, útil en ciertas ocasiones.

Conclusión:

– Texto normal; entrecomillado.

– Variables; sin comillas.

– Texto normal y variables juntas entrecomilladas; vale, pero en ciertas ocasiones usaremos los puntos para separar texto de variable.

Bien, dicho esto, otro problema común es cuando poner el punto y coma y cuando no. Para conocer la diferencia, es necesario diferenciar entre control de flujos (while, if, do, …) y funciones. Pero esto lo veremos en la próxima entrega.

A pasarlo bien x)

Conceptos básicos de PHP (1)


PHP es un lenguaje script orientado principalmente para WEB. Esto significa que no se compila, el servidor lo interpreta y nos muestra el resultado. Para nuestro objetivo, esto realmente nos da igual, asi que pasamos a los conceptos básicos:

¿Cómo funciona toda esta maraña?

Cuando abrimos el navegador y entramos en google, en marca o en redtube para curtirnos en los insondables mundos de la sabiduría infinita, nuestro navegador nos muestra una bonita página. Esto está bien cuando eres el que ve la página, pero nuestro cometido es diseñar esta página, así que debemos aprender como funciona desde que escribimos la dirección hasta que la página está cargada.

Cliente – Servidor

Toda conexión en internet, básicamente, se realiza entre cliente y servidor, es decir, el cliente envía una petición y el servidor le responde con algo. En nuestro caso, cuando escribimos la URL en el navegador, este envía una petición al servidor WEB, el cual la interpreta y le devuelve una página en formato HTML. El servidor JAMÁS nos enviará el código PHP, siempre será HTML.

Cuando el navegador envía, por ejemplo: http://dominio.es/directorio/ejemplo.php, éste asume que le estamos pidiendo el archivo llamado ejemplo.php dentro del directorio “directorio” en la página dominio.es.

El servidor mira dentro de ese archivo en busca de códigos PHP metidos dentro de las etiquetas <? … ?>, dejando el resto del archivo (HTML) sin modificar. Es decir, reemplaza todo lo que contengan las etiquetas <? … ?> por lo que nosotros le digamos dentro de éstas.

Ejemplo:

<html>
<head><title>Ejemplo 1</title></head>
<body>
<?
echo "Hola, soy una cadena de caracteres";

?>

</body>

</html>

El servidor leerá este archivo, y sustituirá las etiquetas <? … ?> por el resultado obtenido dentro de ellas. Es decir, una vez que el servidor lea este archivo, enviará a nuestro navegador (encargado de interpretar el código HTML y mostrarnoslo bonito) el siguiente resultado:

<html>
<head><title>Ejemplo 1</title></head>
<body>
Hola, soy una cadena de caracteres

</body>

</html>

Como podemos observar, el código php ha sido sustituido por su resultado. Esto, y SOLO esto es lo que el navegador obtiene para interpretarlo y mostrarlo bonito. ¿Queda claro que hace el navegador y que hace el servidor? Veamos mas ejemplos:

Sabemos que el servidor interpreta el código php y nos manda el resultado al navegador, por lo que le podemos decir en el código php que nos escriba código HTML, concepto extraño, pero útil:

<?
echo "<html><body>Hola, soy un codigo html dentro de php<body></html>";

<?

¿Cual será el resultado obtenido una vez que el servidor interprete esto? Pues sencillo, sustituirá el código php por el resultado de éste, y como podemos observar, el código php ocupa todo el archivo, por lo que el resultado final sería este:

<html><body>Hola, soy un codigo html dentro de  php<body></html>

¿Se entiende el concepto? En caso afirmativo, ya estás preparado para programar en PHP.

Hasta la siguiente entrega x)