PHP Probleme mit Undefined offset - wie lösen?

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo,

ich habe mir ein script geschrieben welches aus 3 verschiedenen logfiles mir die letzten 10 einträge anzeigen lassen soll:

PHP:
$b = 0;
$error = file ('log/error.log');
        while($b<=10) {
            echo $error[count($error)-$b];
            $b++;
        }

das problem ist nun, dass in der zeile 36 (ist die zeile mit dem echo) nun folgender output im log steht:

PHP:
Notice: Undefined offset: 140 in /Applications/XAMPP/xamppfiles/htdocs/blog/check.php on line 36

mit jedem reload erhöt sich der wert "140" um 1 ...

wie löse ich die meldung?
 
Hi Blackbenji,

das obige kann nicht funktionieren, da das Script mit dem "file" nichts anfangen kann.

Versuche mal die TAIL Funktion PHP, damit klappt es bestimmt! Hier ein Beispiel
 
Array Indizes fangen bei 0 an und nicht bei 1, der letzte Wert ist deswegen count($error) - 1
 
außerdem geht man arrays eher mit foreach durch, da hat man solche probleme nicht.
 
Hm... stimmt. Für die letzten Einträge eines Arrays wäre foreach nicht sinnvoll. Wenn man das Array aber einfach "rückwärts" aufbaut kann man mit ner intelligenten Abbruchbedingung die ersten 10 auslesen.
 
so sieht es jetzt im moment aus.
PHP:
$a = -1;
    $notice = file ('log/notice.log');
    if(count($notice) > 5) {
        while($a>=-10) {
            echo $notice[count($notice)+$a];
            $a--;
        }
    }

einziges problem: wenn das notice.log weniger als 5 einträge hat, wird es immernoch:

PHP:
Notice: Undefined offset: -1 in /Applications/XAMPP/xamppfiles/htdocs/blog/check.php on line 43<br>
Notice: Undefined offset: -2 in /Applications/XAMPP/xamppfiles/htdocs/blog/check.php on line 43<br>
Notice: Undefined offset: -3 in /Applications/XAMPP/xamppfiles/htdocs/blog/check.php on line 43<br>
Notice: Undefined offset: -4 in /Applications/XAMPP/xamppfiles/htdocs/blog/check.php on line 43<br>

ich habe zwar schon eine schleife drum gebaut, aber beim initialen aufruf wird es halt meldungen ... kann man die verhindern, wenn ja wie?
 
Im Zweifel gibts immer noch isset($array['index']) ? macheA($array['index']) : macheB());
 
Slice einfach das Array. In vielen Sprachen geht das direkt als Array-Index, in PHP brauchst du aber eine extra Funktion.

PHP:
$entries = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
$lastFiveEntries = array_slice($entries, -5);
// ergibt [5, 6, 7, 8, 9]

// bei zu wenigen Entries:
$entries = [0, 1];
$lastFiveEntries = array_slice($entries, -5);
// ergibt [0, 1]

Das kannst du dann bei Bedarf noch umdrehen (array_reverse).
 
Code:
$notice = file('error.txt');
$array = array_slice($notice, -10);
foreach ($array as $error) {
    echo $error;
}

das sollte keine Fehlermeldungen ausgeben :)

In der Schleife selbst oder in der Bindung (gemeint ist Bedingung :D) nie count() nutzen, wenn es auch vorher geht!
 
Zuletzt bearbeitet: (Edit: Fehler gekennzeichnet...)
@gh0st2k: vielen dank! funktioniert auf anhieb, keine probleme - macht genau das was ich wollte!

vielen dank dafür!
 
Ich hatte ein ähnliches Problem. Datenzeilen auslesen aus einer csv-Datei. Da in der csv-Datei leider die letzte Zeile eine Leerzeile ist, muss diese letzte Zeile weggelöscht werden. Dann erscheint die Fehlermeldung nicht mehr. :)
 
Zurück
Oben