Autor Tema: PHP no concatena en el orden adecuado salta al final ejercicio tutorial CU00829B  (Leído 2284 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas noches. Os expongo una posible solución del ejercicio CU00829B del curso PHP desde cero:

Citar
EJERCICIO

Crear archivos php que ejecuten la tarea indicada:

a) Dadas las cadenas "aprender" y "aprende", mostrar por pantalla la cadena rellena con * a derecha e izquierda en un número de asteriscos que será siempre 5 a cada lado aunque se cambien las cadenas.

Código: [Seleccionar]
<?php 

$cadena1 "aprender";
$cadena2 "aprende";

function rellenar($cadena){
echo str_pad($cadena, (strlen($cadena)+10) , "*"STR_PAD_BOTH);
}

echo rellenar($cadena1);
echo "<br><br><br>";
echo rellenar($cadena2);

?>

No entiendo por qué así:

Código: [Seleccionar]
<?php 

$cadena1 "aprender";
$cadena2 "aprende";

function rellenar($cadena){
echo str_pad($cadena, (strlen($cadena)+10) , "*"STR_PAD_BOTH);
}

echo rellenar($cadena1)."<br><br><br>".rellenar($cadena2);

?>

no se imprimen por pantalla los saltos de carro.

Citar
b) Dadas las cadenas "aprender" y "aprende", mostrar por pantalla si sus tres primeros caracteres son iguales o no usando una función de comparación de subcadenas.

Código: [Seleccionar]
<?php 

$cadena1 "aprender";
$cadena2 "aprende";

if(strncmp($cadena1$cadena23)==0){
echo "Las primeras 3 lestras de: '".$cadena1."' y '".$cadena2." son iguales";
}else{
echo "Las primeras 3 lestras de: '".$cadena1."' y '".$cadena2." NO son iguales";
}

?>

Citar
c) Dada la cadena "ApRendEr A proGraMar.cOm" transformar la cadena a minúsculas y rellenarla a derecha e izquierda con una longitud de asteriscos igual a la mitad de su longitud si es par ó igual a la mitad de (su longitud más 1) si es impar. Mostrar por pantalla la cadena en minúsculas y con el relleno indicado.

Código: [Seleccionar]
<?php 

$cadena "ApRendEr A proGraMar.cOm";
$cadena strtolower($cadena);

if((strlen($cadena)%2)==0){
echo str_pad($cadenastrlen($cadena)+strlen($cadena)/2"*"STR_PAD_BOTH);
}else{
echo str_pad($cadenastrlen($cadena)+((strlen($cadena)/2)+1), "*"STR_PAD_BOTH);
}

?>

Gracias.

« Última modificación: 12 de Mayo 2016, 09:18 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días, todo bien

En el código donde indicas que no se imprimen por pantalla los saltos de carro el código HTML que veo al ejecutar en el navegador es el siguiente: *****aprender**********aprende*****<br><br><br>

Esto tiene que ver con cómo ejecuta el intérprete php las órdenes y cómo has definido la función rellenar. Es un problema interesante y en un código extenso puede ser muy difícil de detectar.

Cuando vemos esta línea: echo rellenar($cadena1).'hace frio <br><br><br>'.rellenar($cadena2);

Pensamos que se ejecuta de izquierda a derecha, como es lo habitual y pensamos que estamos concatenando cadenas. Sin embargo nos podemos encontrar con resultados no esperados como el que se obtiene aquí cuando tratamos de realizar una concatenación de funciones que ejecutan algo en lugar de devolver algo. La forma de explicarlo sería: la función rellenar que has planteado ejecuta un echo, es decir, no devuelve algo, sino que ejecuta algo sin devolver nada. Esto es importante: diferencia entre ejecutar algo y devolver algo. Al ejecutar, cuando se produce la concatenación, primero ejecuta lo que es susceptible de ejecutar, de ahí que salga por pantalla *****aprender**********aprende***** y luego realiza la concatenación ¿Qué concatena? hace frio <br><br><br> porque no hay nada más que concatenar (lo otro ya se ejecutó).

Si planteamos el código así:

Código: [Seleccionar]
<?php 
$cadena1 "aprender";
$cadena2 "aprende";
function rellenar($cadena){
return str_pad($cadena, (strlen($cadena)+10) , "*"STR_PAD_BOTH);
}
echo rellenar($cadena1).'hace frio <br><br><br>'.rellenar($cadena2);
?>


Ya obtenemos el resultado esperado. Es importante acostumbrarse a trabajar usando return (cuando sea adecuado usarlo).

En este caso, si quieres concatenar, debes concatenar algo. Tú estabas intentando concatenar la ejecución de funciones con una cadena y esto genera un resultado no esperado. Si simplemente concatenas cadenas con otras cadenas devueltas por funciones ya todo va bien.


Saludos.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, Mario.

Gracias por corregir otro ejercicio más.

Me ha gustado mucho la explicación que me diste aquí. Quizás ahora no la entienda del todo, pero sé que más adelante la comprenderé. Creo que lo más importante con lo que me tendré que quedar de tu comentario es:

Citar
Al ejecutar, cuando se produce la concatenación, primero ejecuta lo que es susceptible de ejecutar, de ahí que salga por pantalla *****aprender**********aprende***** y luego realiza la concatenación ¿Qué concatena? hace frio <br><br><br> porque no hay nada más que concatenar (lo otro ya se ejecutó).

y

Citar
Si simplemente concatenas cadenas con otras cadenas devueltas por funciones ya todo va bien.

Debo reconocer que aún me cuesta un poquito acostumbrarme a trabajar con la instrucción "return" en funciones :)

Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".