No está mal, funciona

“No está mal, funciona”, es lo que me dicen muchos de mis alumnos cuando les reviso su código y les señalo algunos errores. Sí, funciona, pero eso no es lo único importante. Por ejemplo, veamos el siguiente fragmento de código escrito en PHP:

if(($fichero = @file("testimonios.txt")) == false)
  echo "No se ha podido abrir el fichero";
else
{
  $num = rand(1, count($fichero));
  $i=1;
  foreach($fichero as $numLinea => $linea)
  {
    if ($i==$num)
    {
      list($titulo, $fecha, $contenido) = explode('###', $linea);
      echo "<fieldset><legend><h2>".htmlspecialchars($titulo) ."</h2></legend>";
      echo htmlspecialchars($contenido)."<br /><br />".htmlspecialchars($fecha);
      echo "</fieldset>";
    }
    $i = $i+1;
  }
}

El propósito de este código es leer un fichero (“testimonios.txt”) que tiene el siguiente formato, en el que cada línea es un testimonio de una persona:

titulo###fecha###contenido
titulo###fecha###contenido
titulo###fecha###contenido

Se tiene que elegir una línea al azar y mostrarla.

¿Qué problemas tiene este código?

  1. Utiliza un bucle para localizar en el array el testimonio a mostrar: los arrays son estructuras de acceso directo, si tienes una posición ($num), accedes y punto, no necesitas un bucle para acceder a una posición.
  2. Parece que tampoco entiende el manejo de foreach(): necesita $i para saber en qué posición está, cuando $numLinea ya le valdría.
  3. Cuando por fin encuentra el testimonio y lo muestra ($i==$num), no finaliza el bucle, sigue y sigue buscando en el array hasta llegar al final.
  4. Utiliza el fieldset y el legend, cuyo propósito es agrupar controles en un formulario, para mostrar el testimonio en una “caja bonita” con borde.

Esto no lo ha hecho un alumno de primero, es de un alumno de tercero.