Aviso de PHP: Desplazamiento indefinido: 1 con array al leer datos

Estoy recibiendo este error de PHP:

PHP Notice:  Undefined offset: 1

Este es el código PHP que lo arroja:

$file_handle = fopen($path."/Summary/data.txt","r"); //open text file
$data = array(); // create new array map

while (!feof($file_handle) ) {
    $line_of_text = fgets($file_handle); // read in each line
    $parts = array_map('trim', explode(':', $line_of_text, 2)); 
    // separates line_of_text by ':' trim strings for extra space
    $data[$parts[0]] = $parts[1]; 
    // map the resulting parts into array 
    //$results('NAME_BEFORE_:') = VALUE_AFTER_:
}

¿Qué significa este error? ¿Qué causa este error?

Solución

Cambiar

$data[$parts[0]] = $parts[1];

a

if ( ! isset($parts[1])) {
   $parts[1] = null;
}

$data[$parts[0]] = $parts[1];

o simplemente:

$data[$parts[0]] = isset($parts[1]) ? $parts[1] : null;

No todas las líneas de su archivo tienen dos puntos y, por lo tanto, explotar en ellas devuelve un array de tamaño 1.

Según php.net posibles valores de retorno de explode:

Devuelve un array de cadenas creado al dividir el parámetro de cadena en los límites formados por el delimitador.

Si el delimitador es una cadena vacía (""), explode() devolverá FALSE. Si el delimitador contiene un valor que no está contenido en la cadena y se utiliza un límite negativo, entonces se devolverá una matriz vacía, de lo contrario se devolverá una matriz que contiene la cadena.

Comentarios (0)

Cómo reproducir el error anterior en PHP:

php> $yarr = array(3 => 'c', 4 => 'd');

php> echo $yarr[4];
d

php> echo $yarr[1];
PHP Notice:  Undefined offset: 1 in 
/usr/local/lib/python2.7/dist-packages/phpsh/phpsh.php(578) : 
eval()'d code on line 1

¿Qué significa ese mensaje de error?

Significa que el compilador de php buscó la clave 1 y corrió el hash contra ella y no encontró ningún valor asociado a ella entonces dijo Undefined offset: 1.

**¿Cómo puedo hacer que ese error desaparezca?

Preguntar al array si la clave existe antes de devolver su valor así:

php> echo array_key_exists(1, $yarr);

php> echo array_key_exists(4, $yarr);
1

Si el array no contiene su clave, no pregunte por su valor. Aunque esta solución hace que tu programa tenga que trabajar dos veces para "comprobar si está ahí" y luego "ir a buscarla".

Solución alternativa que'es más rápida:

Si obtener una clave que falta es una circunstancia excepcional causada por un error, es más rápido simplemente obtener el valor (como en echo $yarr[1];), y atrapar ese error de desplazamiento y manejarlo así: https://stackoverflow.com/a/5373824/445131

Comentarios (0)

Esto es un "Aviso de PHP", por lo que en teoría podría ignorarlo. Cambie php.ini:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

A

error_reporting = E_ALL & ~E_NOTICE

Esto muestra todos los errores, excepto los avisos.

Comentarios (0)