web-dev-qa-db-fra.com

PHP Avis: Offset non défini: 1 avec tableau lors de la lecture de données

Je reçois cette erreur PHP:

PHP Notice:  Undefined offset: 1

Voici le code PHP qui le jette:

$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_:
}

Que signifie cette erreur? Qu'est-ce qui cause cette erreur?

56
alchuang

Changement 

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

à

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

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

ou simplement:

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

Deux lignes de votre fichier ne sont pas marquées par un signe deux-points. Par conséquent, une vue éclatée renvoie un tableau de taille 1.

Selon php.net, les valeurs de retour possibles à partir de explode :

Retourne un tableau de chaînes créé en fractionnant le paramètre de chaîne sur les limites formées par le délimiteur.

Si le délimiteur est une chaîne vide (""), explode () renverra FALSE. Si le délimiteur contient une valeur qui n'est pas contenue dans la chaîne et qu'une limite négative est utilisée, un tableau vide sera renvoyé, sinon un tableau contenant une chaîne sera renvoyé.

100
GGio

Comment reproduire l'erreur ci-dessus 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

Que signifie ce message d'erreur?

Cela signifie que le compilateur php a recherché la clé 1 et a exécuté le hachage contre celle-ci et n'a trouvé aucune valeur associée à celle-ci, puis a déclaré Undefined offset: 1

Comment puis-je faire disparaître cette erreur?

Demandez au tableau si la clé existe avant de renvoyer sa valeur comme ceci:

php> echo array_key_exists(1, $yarr);

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

Si le tableau ne contient pas votre clé, ne demandez pas sa valeur. Bien que cette solution fasse double emploi pour que votre programme "vérifie si c'est là" et ensuite "va le chercher". 

Solution alternative plus rapide:

Si obtenir une clé manquante est une circonstance exceptionnelle causée par une erreur, il est plus rapide d'obtenir simplement la valeur (comme dans echo $yarr[1];), d'attraper cette erreur de décalage et de la gérer comme ceci: https://stackoverflow.com/a/ 5373824/445131

19
Eric Leschinski

Ceci est un "avis PHP", donc vous pouvez en théorie l'ignorer. Changer php.ini:

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

À

error_reporting = E_ALL & ~E_NOTICE

Cela montre toutes les erreurs, sauf les avis.

1
Orijmm

J'ai récemment eu ce problème et je ne pensais même pas que c'était mon erreur de frappe:

Array("Semester has been set as active!", true)
Array("Failed to set semester as active!". false)

Et en fait ça l'était! Je viens de taper accidentellement ". " plutôt que ", " ...

0
Erikas

Masquer les avertissements php dans le fichier

error_reporting(0);
0
Vitalicus

ma solution la plus rapide était de moins 1 à la longueur du tableau 

  $len = count($data);

    for($i=1; $i<=$len-1;$i++){
      echo $data[$i];
    }

mon offset était toujours la dernière valeur si le compte était 140, alors il dirait offset 140 mais après avoir utilisé le moins 1, tout allait bien

0

La solution idéale serait comme ci-dessous. Vous ne manquerez pas les valeurs de 0 à n.

$len=count($data); for($i=0;$i<$len;$i++) echo $data[$i]. "<br>";
0
Sashi Giri