Ανακοίνωση PHP: κατά την ανάγνωση δεδομένων

Λαμβάνω αυτό το σφάλμα PHP:

PHP Notice:  Undefined offset: 1

Εδώ είναι ο κώδικας PHP που το προκαλεί:

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

Τι σημαίνει αυτό το σφάλμα; Τι προκαλεί αυτό το σφάλμα;

Λύση

Αλλαγή

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

σε

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

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

ή απλά:

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

Δεν υπάρχει σε κάθε γραμμή του αρχείου σας άνω και κάτω τελεία και επομένως το explode σε αυτήν επιστρέφει έναν πίνακα μεγέθους 1.

Σύμφωνα με το php.net πιθανές τιμές επιστροφής από το explode:

Επιστρέφει έναν πίνακα από συμβολοσειρές που δημιουργείται από τη διάσπαση της παραμέτρου συμβολοσειράς στα όρια που σχηματίζονται από τον διαχωριστή. &gt, Εάν το delimiter είναι κενή συμβολοσειρά (""), η explode() θα επιστρέψει FALSE. Αν το delimiter περιέχει μια τιμή που δεν περιέχεται στο string και χρησιμοποιείται αρνητικό όριο, τότε θα επιστραφεί ένας άδειος πίνακας, διαφορετικά θα επιστραφεί ένας πίνακας που περιέχει το string.

Σχόλια (0)

Πώς να αναπαράγετε το παραπάνω σφάλμα σε 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

Τι σημαίνει αυτό το μήνυμα σφάλματος;

Σημαίνει ότι ο μεταγλωττιστής της php έψαξε για το κλειδί 1 και έτρεξε το hash εναντίον του και δεν βρήκε καμία τιμή που να σχετίζεται με αυτό και μετά είπε Απροσδιόριστο offset: 1

Πώς μπορώ να εξαφανίσω αυτό το σφάλμα;

Ρωτήστε τον πίνακα αν υπάρχει το κλειδί πριν επιστρέψετε την τιμή του, όπως παρακάτω:

php> echo array_key_exists(1, $yarr);

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

Αν ο πίνακας δεν περιέχει το κλειδί σας, μην ρωτήσετε για την τιμή του. Αν και αυτή η λύση κάνει διπλή δουλειά για το πρόγραμμά σας να "ελέγξει αν υπάρχει'και μετά "πάει να το πάρει'.

Εναλλακτική λύση που είναι ταχύτερη:

Αν το να πάρετε ένα κλειδί που λείπει είναι μια εξαιρετική περίσταση που προκαλείται από κάποιο σφάλμα, είναι πιο γρήγορο να πάρετε απλά την τιμή (όπως στο echo $yarr[1];), και να πιάσετε αυτό το σφάλμα offset και να το χειριστείτε ως εξής: https://stackoverflow.com/a/5373824/445131

Σχόλια (0)

Πρόκειται για μια ειδοποίηση "PHP Notice", οπότε θεωρητικά μπορείτε να την αγνοήσετε. Αλλάξτε το αρχείο php.ini:

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

Σε

error_reporting = E_ALL & ~E_NOTICE

Αυτό δείχνει όλα τα σφάλματα, εκτός από τις ειδοποιήσεις.

Σχόλια (0)