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 PHPSin 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
- 1El operador == de PHP no compara solo contenido: primero intenta ajustar los tipos y después compara. Se le llama comparación suelta.
- 2Cuando los dos operandos son cadenas y AMBAS contienen números válidos, PHP las compara como números, no como texto.
- 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.
- 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í.
- 5El arreglo es usar === en toda comparación de identificadores, códigos, documentos, tokens y contraseñas: if ($codigo_sede === $digitado).
- 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
- 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.
- 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].
- 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].
- 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].
- 5El arreglo es liberar la referencia en cuanto se termina de usar: unset($v); justo después del foreach por referencia.
- 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