Foros del Web » Programando para Internet » PHP »

Juego: "¿Dónde está el error?"

Estas en el tema de Juego: "¿Dónde está el error?" en el foro de PHP en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original <?php if ( "asdf" == 0 )     echo 'cierto' ; else     echo 'falso' ; ¿Porque ...

  #121 (permalink)  
Antiguo 27/12/2010, 13:44
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Código PHP:
Ver original
  1. <?php
  2. if("asdf" == 0)
  3.     echo 'cierto';
  4. else
  5.     echo 'falso';
¿Porque imprime cierto?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #122 (permalink)  
Antiguo 27/12/2010, 13:48
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

Por lo mismo que ya mencioné en el mensaje #110 de este hilo . Cuando un string se convierte a entero, el valor de éste es dado por los primeros caracteres numéricos del string. En tu código, al no haber caracteres numéricos al inicio del string el valor del entero final es 0.

Esto está muy bien explicado aqui: http://www.php.net/manual/en/languag...ing.conversion (Lectura recomendada en inglés, pues la traducción en español no es fiel al manual original)

Saludos,
  #123 (permalink)  
Antiguo 27/12/2010, 13:52
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Solo queria lanzar uno para ver si alguien contestaba algo diferente, pero ya que lo hiciste te toca También aquí hay más detalle http://php.net/manual/en/language.op...comparison.php
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #124 (permalink)  
Antiguo 27/12/2010, 14:04
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

Tengo un array con 3 frutas y una función que las traduce a inglés.

Código PHP:
<?php

$frutas 
= array('manzana''platano''naranja');
$accion "traducir";

$traducir = function (&$frutas) {
    foreach(
$frutas as $indice => $fruta):
        switch(
$fruta):
            case 
'manzana'$fruta 'apple'; break;
            case 
'platano'$fruta 'banana'; break;
            case 
'naranja'$fruta 'orange'; break;
        endswitch;
    endforeach;
};

${
$accion}($frutas);

print_r($frutas);
Sin embargo, al finalizar la ejecución se imprime...

Código:
Array
(
    [0] => manzana
    [1] => platano
    [2] => naranja
)
...lo que indica que el script no funcionó. ¿Qué está mal?

Última edición por okram; 27/12/2010 a las 19:40
  #125 (permalink)  
Antiguo 27/12/2010, 14:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

foreach trabaja con una copia del array. Podría usarse la sintaxis foreach($frutas as $indice => &$fruta): para obtener el resultado esperado.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #126 (permalink)  
Antiguo 27/12/2010, 14:07
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

Tu turno
  #127 (permalink)  
Antiguo 27/12/2010, 14:18
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 6 meses
Puntos: 832
Respuesta: Juego: "¿Dónde está el error?"

Increíble. Sólo una "&" en el foreach. A esto le llamo una lección.
  #128 (permalink)  
Antiguo 27/12/2010, 17:43
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 2 meses
Puntos: 80
Respuesta: Juego: "¿Dónde está el error?"

Se aprende mas con estos jueguitos que preguntando...
Muy Buena idea...
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #129 (permalink)  
Antiguo 27/12/2010, 22:53
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

La siguiente función tiene como propósito persistir un valor en las sucesivas llamadas, pero tiene un error:
Código PHP:
Ver original
  1. function savevar($byvar = null, $byref = null) {
  2.     static $bar;
  3.     if (isset($byvar))
  4.         $bar = $byvar;
  5.     if (isset($byref))
  6.         $bar =& $GLOBALS[$byref];
  7.     return $bar;
  8. }
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #130 (permalink)  
Antiguo 28/12/2010, 05:23
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Podrías dar un ejemplo de uso, porque sinceramente me perdí con solamente mencionar la función
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #131 (permalink)  
Antiguo 28/12/2010, 07:18
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Si pongo ejemplos pierde la gracia, jaja.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #132 (permalink)  
Antiguo 28/12/2010, 12:26
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

¿Será que una variable declarada como estática no almacena o conserva para posteriores llamadas a la función datos pasados por referencia?

Saludos,
  #133 (permalink)  
Antiguo 28/12/2010, 12:44
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Correcto.

Esto se esperaría que imprima "texto" pero no imprime nada:
Código PHP:
Ver original
  1. $foo = 'texto';
  2. savevar(null, 'foo');
  3. echo savevar();
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #134 (permalink)  
Antiguo 28/12/2010, 21:10
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

Este será un poquito largo

Código PHP:
<?php

$numeros 
range(110);
$numeros array_combine($numeros$numeros);

extract($numerosEXTR_PREFIX_INVALID'numero');

/*
  Hasta este punto tenemos las variables $numero_1 = 1; 
  $numero_2 = 2; $numero_3 = 3; .... ; $numero_6 = 6. 
  Serán referidas como "variables N"
*/

/* Función para eliminar las variables N */
$eliminar = function ($numero) {
    global ${
"numero_$numero"};
    unset(${
"numero_$numero"});
};

/*
  Recorremos el array y eliminamos (mediante la función 
  variable $eliminar) aquellas variables N que se crearon 
  a partir de los números PARES
*/
array_map(
    
create_function('$numero''
        if($numero % 2 == 0) {
            global $eliminar; 
            $eliminar($numero);
        }
    '
),
    
$numeros
);

/*
  Verificamos que se hayan eliminado las variables N pares. 
  Para ello recorremos el array y verificamos la existencia de 
  la variable N correspondiente a cada elemento del array.
*/
foreach($numeros as $indice => $numero):
    if(isset(${
"numero_$indice"})) {
        echo 
"La variable \$numero_$indice existe y su valor es " . ${"numero_$indice"} . "\n";
    } else {
        echo 
"La variable \$numero_$indice NO existe\n";
    }
endforeach;
Resultado esperado:
Código:
La variable $numero_0 NO existe
La variable $numero_1 existe y su valor es 1
La variable $numero_2 NO existe
La variable $numero_3 existe y su valor es 3
La variable $numero_4 NO existe
La variable $numero_5 existe y su valor es 5
La variable $numero_6 NO existe
Resultado obtenido:
Código:
La variable $numero_0 existe y su valor es 0
La variable $numero_1 existe y su valor es 1
La variable $numero_2 existe y su valor es 2
La variable $numero_3 existe y su valor es 3
La variable $numero_4 existe y su valor es 4
La variable $numero_5 existe y su valor es 5
La variable $numero_6 existe y su valor es 6
¿Qué salió mal?
  #135 (permalink)  
Antiguo 28/12/2010, 21:15
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Que al ejecutar unset() en ese contexto lo único que se borra es la referencia creada con global. Podría usarse unset($GLOBALS["numero_$numero"]); para obtener el resultado esperado.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #136 (permalink)  
Antiguo 28/12/2010, 21:20
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

En efecto.

Y recuerden también que pasa lo mismo con las variables estáticas (declaradas con static) dentro de una función. Al usar unset() en ellas, se borra la referencia, mas la variable sigue conservando su valor en las siguientes llamadas a la función.
  #137 (permalink)  
Antiguo 29/12/2010, 08:23
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Código PHP:
Ver original
  1. $true = true;
  2. @define('true', false);
  3. function iif($bool, $true, $false)
  4. {
  5.     return $bool === true ? $true : $false;
  6. }
  7. $foo = false OR $true;
  8. echo iif((bool) $foo, 'verdadero', 'falso');
¿Cuál es el resultado y por qué?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #138 (permalink)  
Antiguo 29/12/2010, 09:01
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Bueno lo primero que true es una palabra reservada y no se puede usar, originalmente si se quita el simbolo de @ antes de define, debe dar una notificación, y $foo siempre va a dar false porque no estás haciendo una comparación como tal.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #139 (permalink)  
Antiguo 29/12/2010, 09:31
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

¿A qué te refieres con que "no estás haciendo una comparación como tal"?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #140 (permalink)  
Antiguo 29/12/2010, 09:35
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Bueno, sinceramente no sé si hacer esto
Código PHP:
Ver original
  1. $foo = false OR $true;
es hacer una comparación, porque siempre va a dar false. En ello le estás diciendo que tome el primer valor.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #141 (permalink)  
Antiguo 29/12/2010, 10:27
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Vale, pero eso aún no contesta la pregunta. ¿Por qué ocurre así?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #142 (permalink)  
Antiguo 29/12/2010, 12:43
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 17 años, 2 meses
Puntos: 101
Respuesta: Juego: "¿Dónde está el error?"

Imprimiria "verdadero"... porque el define daria error y no se cambiaria el valor de true. Y $foo no es una comparacion, es como hacer "if(false or true)" y daria true. Creo no estoy seguro y no tengo como probar el codigo :P
__________________
Half Music - www.halfmusic.com
  #143 (permalink)  
Antiguo 29/12/2010, 12:45
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

No, no es ese el resultado que produce.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #144 (permalink)  
Antiguo 29/12/2010, 12:51
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 17 años, 2 meses
Puntos: 101
Respuesta: Juego: "¿Dónde está el error?"

uh.. bueno ahora me quedo la duda que sucede con "define('true', false);" :P
__________________
Half Music - www.halfmusic.com
  #145 (permalink)  
Antiguo 29/12/2010, 12:56
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Juego: "¿Dónde está el error?"

Lo que yo entiendo que ocurre es que se declara siempre false porque no ha ocurrido algún error y PHP asigna el valor que se menciona primero en $foo. Por eso el resultado que produce echo es falso en vez de imprimir verdadero porque le estás indicado que el valor booleano es false y el ternario ejecuta la segunda parte que es cuando no es cierta la condición.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #146 (permalink)  
Antiguo 29/12/2010, 15:14
Avatar de silvanha  
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 8 meses
Puntos: 65
Respuesta: Juego: "¿Dónde está el error?"

Vaya, que me llamo la atención esto de ver los pedacitos de código, (salvo la vecina de Abimael, me asustas.. con esa gente convives? XD)

En fin, el último código produce falso, según yo y mis análisis, porque se define a $foo como falso..
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)
  #147 (permalink)  
Antiguo 29/12/2010, 21:02
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Cita:
Iniciado por silvanha Ver Mensaje
En fin, el último código produce falso, según yo y mis análisis, porque se define a $foo como falso..
En el caso de que allí esté el problema, ¿por qué $foo se define como falso si se espera que sea verdadero?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #148 (permalink)  
Antiguo 29/12/2010, 21:46
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 3 meses
Puntos: 214
Respuesta: Juego: "¿Dónde está el error?"


<saludos>
Pues en primera, si se copia el código
y se pega para probar en un editor, la función iif da error unexpected T_STRING

Sin embargo, si se hace a mano el código funciona bien

Ahora, cambiando esto nos retorna falso porque
la variable $foo se asigna como tal, por más que se use el OR (si pusieramos true OR $true devolvería verdadero) como ya anteriormente mencionó abimaelrc

Además, se esta definiendo una variable con una palabra
reservada, y por esto mismo se asignara el valor de la variable
reservada, si quisieramos hacer uso de la variable que esta en define,
podriamos llamarla "truetrue", para que sea distinta a la palabra reservada

</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #149 (permalink)  
Antiguo 29/12/2010, 21:47
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Juego: "¿Dónde está el error?"

La clave está en la línea que citó abimaelrc.

Código PHP:
$foo false OR $true
Resulta que el operador lógico || no funciona de la misma manera que OR. Ciertamente el primero tiene mayor prioridad que el segundo.

Esto se ve más claro en el siguiente ejemplo:

Uso del operador ||
Código PHP:
$foo false || true;
var_dump($foo); // true

// Es equivalente a:
$foo = ( false || true );
var_dump($foo); // true 
Como es lógico, la expresión (false || true) devuelve true, ya que basta que uno de los dos sea verdadero.

Uso del operador OR
Código PHP:
$foo false OR true;
var_dump($foo); // false

// Es equivalente a:
$foo false ) OR true;
var_dump($foo); // false 
En este segundo caso, ya que OR tiene menor importancia, primero se asigna "false" a $foo, y el resultado de esta expresión pues es el mismo valor, osea, false. Luego, recién se opera con la segunda expresión (luego del OR) que sería true. El resultado de toda esta expresión sería true, pero $foo no recibe este valor final, ya que es evaluado al inicio. De hecho, nadie lo toma, pero se puede comprobar de la siguiente forma:

Código PHP:
// $foo = false OR true == false OR true == true
var_dump$foo false OR true ); //true 
En resumen. El comportamiento es el correcto al usar el operador OR. Si usáramos el operador || obtendríamos el resultado "esperado"
  #150 (permalink)  
Antiguo 29/12/2010, 21:50
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Juego: "¿Dónde está el error?"

Correcto.

Tu turno okram; ya que los demás aunque indicaron el problema, no respondieron a la pregunta principal que era el por qué de ese comportamiento.

De todo esto, la lección es que AND y &&; OR y || no se comportan exactamente de la misma manera. De hecho AND y OR son de los pocos operadores que tienen menor precedencia que el operador de asignación.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Etiquetas: a-por-la-vecina-de-meta, juegos
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 40 personas




La zona horaria es GMT -6. Ahora son las 14:58.