Materias · 🏛️ Universidad y trabajo

PHP

Ejercicios resueltos de PHP paso a paso, con el error que más se comete en cada uno: Comparación de valores (== y ===), Arreglos y más. Gratis y en español.

Preguntarle al tutor de PHP

Sin instalar nada. Puedes probar antes de crear cuenta.

Ejercicios resueltos de PHP

Resueltos paso a paso, como te los explicaría el tutor, y con el error que más se comete.

Comparación de valores (== y ===)

Un validador de códigos de sede acepta un código que no debería: $codigo_sede = "7"; $digitado = "007"; if ($codigo_sede == $digitado) { echo "Sede correcta"; } Imprime «Sede correcta». ¿Por qué y cómo se arregla?

Cómo se resuelve

  1. 1El operador == de PHP no compara solo contenido: primero intenta ajustar los tipos y después compara. Se le llama comparación suelta.
  2. 2Cuando los dos operandos son cadenas y AMBAS contienen números válidos, PHP las compara como números, no como texto.
  3. 3"7" vale numéricamente 7 y "007" también vale 7, porque los ceros a la izquierda no cambian el valor de un número. Entonces 7 == 7 da true.
  4. 4El operador === no hace ninguna conversión: compara primero el tipo y después el contenido carácter por carácter. "7" === "007" da false, que es lo que se necesita aquí.
  5. 5El arreglo es usar === en toda comparación de identificadores, códigos, documentos, tokens y contraseñas: if ($codigo_sede === $digitado).
  6. 6La misma trampa aparece con funciones de búsqueda: strpos devuelve 0 cuando encuentra el texto al principio, y con == ese 0 se confunde con false. Por eso siempre va strpos(...) !== false.

Respuesta: Porque == compara dos cadenas numéricas como números, y "007" vale lo mismo que "7". Se arregla con ===, que compara tipo y contenido: "7" === "007" es false.

El error de siempre: Suponer que el problema desaparece con in_array. in_array usa comparación suelta por defecto, así que in_array("007", ["7", "8"]) devuelve true. Hay que pasarle el tercer parámetro: in_array("007", ["7", "8"], true).

Arreglos

El último elemento sale duplicado y el programa no toca los datos entre los dos ciclos: $valores = [1, 2, 3]; foreach ($valores as &$v) { } foreach ($valores as $v) { } print_r($valores); // [1, 2, 2] ¿Qué pasó?

Cómo se resuelve

  1. 1El & del primer foreach hace que $v sea una referencia al elemento de turno, no una copia. Sirve para modificar el arreglo mientras se recorre.
  2. 2Cuando ese primer foreach termina, la variable $v no se destruye: sigue existiendo y sigue siendo una referencia al último elemento, o sea a $valores[2].
  3. 3El segundo foreach reutiliza el mismo nombre $v. Cada vuelta le asigna el valor actual, pero como $v sigue siendo una referencia, esa asignación escribe dentro de $valores[2].
  4. 4Vuelta 1: $v recibe $valores[0], que es 1, y el arreglo queda [1, 2, 1]. Vuelta 2: $v recibe $valores[1], que es 2, y queda [1, 2, 2]. Vuelta 3: $v recibe $valores[2], que ahora vale 2, y queda igual: [1, 2, 2].
  5. 5El arreglo es liberar la referencia en cuanto se termina de usar: unset($v); justo después del foreach por referencia.
  6. 6Alternativa sin referencias: recorrer por clave y escribir con el índice, foreach ($valores as $i => $valor) { $valores[$i] = ...; }, que no deja nada colgando.

Respuesta: La variable $v del primer foreach quedó viva como referencia a $valores[2], y el segundo ciclo le fue escribiendo los valores encima. Se evita con unset($v); después del foreach por referencia.

El error de siempre: Culpar al segundo foreach y renombrar su variable. Funciona por casualidad y esconde el problema real: la referencia sigue viva y va a morder en cualquier otro punto de la función que use ese nombre. La regla es que todo foreach con & lleva su unset inmediatamente después.

¿Y si tu ejercicio no es ninguno de estos?

No hace falta buscar el ejercicio exacto en internet. Trae el tuyo, o pide los que te falten.

Todo esto es gratis y sin instalar nada. Puedes probar antes de crear cuenta.

Lo que cubre

  • Comparación de valores (== y ===)
  • Arreglos

Preguntas que le puedes hacer

  • Comparación de valore…Explícame «Comparación de valores (== y ===)» con un ejemplo práctico y dime en qué suele equivocarse la gente.
  • ArreglosExplícame «Arreglos» con un ejemplo práctico y dime en qué suele equivocarse la gente.

Cómo enseña este tutor

Es riguroso y completo: justifica cada paso y nombra el teorema, la norma o la buena práctica que está aplicando, para que puedas citarla en tu trabajo o en el parcial.

  • · Te muestra el camino completo, no solo el resultado.
  • · Si algo no te cuadra, te lo explica otra vez de otra manera.
  • · Con una foto de tu cuaderno te dice dónde está el error.
  • · Te arma quizzes de lo que acabas de ver para saber si de verdad quedó.

Otras materias de Universidad y trabajo