Foros del Web » Programando para Internet » PHP »

Uso de for y switch

Estas en el tema de Uso de for y switch en el foro de PHP en Foros del Web. buenas amigos del foro, en la universidad me dejarón la siguiente pregunta: Diseñe y programe una página que permita ingresar un número y mostrar el ...
  #1 (permalink)  
Antiguo 24/05/2014, 21:15
Avatar de frankjoel86  
Fecha de Ingreso: noviembre-2008
Ubicación: Ica
Mensajes: 295
Antigüedad: 16 años
Puntos: 0
Uso de for y switch

buenas amigos del foro, en la universidad me dejarón la siguiente pregunta: Diseñe y programe una página que permita ingresar un número y mostrar el nombre de cada uno de sus dígitos.

lo que eh podido avanzar es:
<?php
$n=$_POST['txtNumero'];
for ($i = 1; $i <= strlen($n); $i++) {
$ini=$ini+1;
$num=substr($n,$ini,$i);

switch($num){
case 1:
echo "Uno "; break;
case 2:
echo "Dos ";break;
case 3:
echo "Tres ";break;
}
}
?>

Cualquier ayuda es bienvenida, gracias de antemano.
__________________
www.basritours.com
Agencia de turismo en Ica.
  #2 (permalink)  
Antiguo 24/05/2014, 21:48
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 13 años, 2 meses
Puntos: 397
Respuesta: Uso de for y switch

Si solo es decir en letras cada número de la consulta. Entiéndase:

45 = cuatro cinco

Debes de hacer algo como esto (solo hablaré del flujo)

Recibes el dato.

Puedes usar str_split que te transforma una cadena en un array.

Recorrer cada parte del array.

Usar switch para determinar que número es.

Imprimir la palabra correspondiente.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 25/05/2014, 01:20
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Uso de for y switch

Se me ocurre una solución sin el uso de una estructura selectiva:

Código PHP:
Ver original
  1. function nomNum($numero){
  2.     $nombres = array('Cero', 'Uno', 'Dos', 'Tres', 'Cuatro', 'Cinco', 'Seis', 'Siete', 'Ocho', 'Nueve');
  3.     return $nombres[$numero];
  4. }
  5.  
  6. $num = 34234;
  7. echo implode(', ', array_map('nomNum', str_split($num)));

Lo anterior imprimirá: Tres, Cuatro, Dos, Tres, Cuatro.

Y si tienes una versión de PHP mayor o igual a la 5.4, puedes hacerlo con una función lambda.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #4 (permalink)  
Antiguo 25/05/2014, 04:34
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Uso de for y switch

Otra solución:
Código PHP:
Ver original
  1. echo filter_input(INPUT_POST, 'txtNumero', FILTER_CALLBACK, ['options' => function($n) {
  2.     return implode(', ', array_map(function($n) {
  3.         return ['cero', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve'][$n];
  4.     }, str_split($n)));
  5. }]);
  #5 (permalink)  
Antiguo 25/05/2014, 11:46
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 13 años, 2 meses
Puntos: 397
Respuesta: Uso de for y switch

Bueno señores yo no estoy de acuerdo con ustedes por una sencilla razón, si bien es cierto de que las soluciones son válidas olvidan un detalle importante

Cita:
en la universidad me dejarón la siguiente pregunta: Diseñe y programe una página que permita ingresar un número y mostrar el nombre de cada uno de sus dígitos.
No creo que sea correcto darle código ya hecho... por eso le dejé el flujo para que el aprenda por si mismo y pueda desarrollar el problema.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #6 (permalink)  
Antiguo 25/05/2014, 12:06
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Uso de for y switch

Cita:
Iniciado por lolainas Ver Mensaje
Otra solución:
Código PHP:
Ver original
  1. echo filter_input(INPUT_POST, 'txtNumero', FILTER_CALLBACK, ['options' => function($n) {
  2.     return implode(', ', array_map(function($n) {
  3.         return ['cero', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve'][$n];
  4.     }, str_split($n)));
  5. }]);
No es por criticar...... pero me parece un uso excesivo de funciones para algo tan simple.... prefiero la solucion de @Alexis88 en ese sentido

Que ganas con hacer pasar el $POST por filter_input() ? de todas formas haras un foreach / for / etc o un array_map() + implode() ... y ohhh... tambien un str_split() ??
__________________
Salu2!
  #7 (permalink)  
Antiguo 25/05/2014, 12:10
lolainas
Invitado
 
Mensajes: n/a
Puntos:
es una alterniva, sólo basta con no aplicarla si no te gusta :)
  #8 (permalink)  
Antiguo 25/05/2014, 12:21
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Uso de for y switch

Toda la razón, jonni09lo, pero a veces no puedo con mi genio y si me interesa el tema, no transcurre ni medio minuto y ya estoy desarrollándolo, y aunque no sea lo correcto ya que no está bien hacerle los deberes, al menos queda como aporte.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 25/05/2014, 12:22
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Uso de for y switch

Aca mi variacion de la de Alexix88:

Código PHP:
Ver original
  1. <?php
  2. function nomNum($n){   
  3.     $d = str_split(strval($n));
  4.     return  implode(' ',array_map(function($d){$nombres = array('Cero', 'Uno', 'Dos', 'Tres', 'Cuatro', 'Cinco', 'Seis', 'Siete', 'Ocho', 'Nueve'); return $nombres[$d];},$d));
  5. }
  6.  
  7. echo nomNum(443541);

La ventaja de esta variacion es que termino de empaquetar toda la funcionalidad en nomNum() a diferencia de la version original que deja algo en el main()
__________________
Salu2!

Última edición por Italico76; 25/05/2014 a las 12:28
  #10 (permalink)  
Antiguo 25/05/2014, 12:30
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Uso de for y switch

Buena, Italico76, es más o menos lo que planteaba con el uso de la función anónima para hacerlo todo en una sola línea, aunque ya lo unificaste en una función, así sería más práctico su uso.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 25/05/2014, 12:36
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Uso de for y switch

Cita:
<?php
function nomNum($n){
$d = str_split(strval($n));
return implode(' ',array_map(function($d){$nombres = array('Cero', 'Uno', 'Dos', 'Tres', 'Cuatro', 'Cinco', 'Seis', 'Siete', 'Ocho', 'Nueve'); return $nombres[$d];},$d));
}

echo nomNum(443541);
Usas el mismo numéro de funciones que aquí:

Cita:
echo filter_input(INPUT_POST, 'txtNumero', FILTER_CALLBACK, ['options' => function($n) {
return implode(', ', array_map(function($n) {
return ['cero', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve'][$n];
}, str_split($n)));
}]);
Según tu criterio de no usar funciones, el de Alexis te seguirá gustando más.
  #12 (permalink)  
Antiguo 25/05/2014, 13:27
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Uso de for y switch

@lolainas : pues posiblemente si me guio por el criterio de "numero de invocacion a funciones" pero a lo que me referia de tu solucion es que usas filter_input() para nada en especial y "supongo" que esa funcion debe tener un costo alto...

Y para ser justos en la comparacion... toca encasular algo de su codigo:

Código PHP:
function nomNum(){
    return 
filter_input(INPUT_POST'txtNumero'FILTER_CALLBACK, ['options' => function($n) {
    return 
implode(', 'array_map(function($n) {
        return [
'cero''uno''dos''tres''cuatro''cinco''seis''siete''ocho''nueve'][$n];
    }, 
str_split($n)));
}]);
}

echo 
nomNum(); 
1 + 1 + 1 + 1 + 1 + 1= 6 "function calls"


Código PHP:
function nomNum($numero){
    
$nombres = array('Cero''Uno''Dos''Tres''Cuatro''Cinco''Seis''Siete''Ocho''Nueve');
    return 
$nombres[$numero];
}
 
$num 34234;
echo 
implode(', 'array_map('nomNum'str_split($num))); 
= 3 "function calls"

Código PHP:
<?php
function nomNum($n){    
    
$d str_split(strval($n));
    return  
implode(' ',array_map(function($d){$nombres = array('Cero''Uno''Dos''Tres''Cuatro''Cinco''Seis''Siete''Ocho''Nueve'); return $nombres[$d];},$d));
}
 
echo 
nomNum(443541);
1 + 1 + 1 + 1 + 1 = 5 "function calls"


Sino hice mal las cuentas... la de Alexis88 seria la de menos function calls efectivamente


EXTRA: su codigo no es compatible con PHP hasta su version 5.5 por esto:

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Solo PHP 5 >= 5.5
  4. echo ['cero', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve'][5];
__________________
Salu2!

Última edición por Italico76; 25/05/2014 a las 15:45

Etiquetas: switch
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 13:11.