PHP-Arrays und Lösung für 'undefined index' Fehler
Arbeite ich durch einige code erfolgt durch einen früheren Entwickler. Ich bin Recht neu in PHP, so Frage ich mich, ob es irgendwelche bekannten Muster oder eine Lösung für dieses problem.
Grundsätzlich der ursprüngliche Autor nicht überprüfen Sie alle array-Indizes, bevor er versucht, Sie zu benutzen. Ich weiß, dass ich kann verwenden Sie isset() zu überprüfen, bevor es verwendet wird, aber gerade jetzt gibt es Hunderte von Zeilen, in denen diese Fehler auftreten. Bevor ich auf einige Musik-und start knallte mein Kopf in meine Tastatur, die ich will, um sicherzustellen, dass es nicht einige nette Abkürzung für den Umgang mit diesem. Hier ist ein typischer code-Abschnitt, der ich bin, schaut unter:
/* snip */
"text" => $link . $top_pick_marker . $output['author'] . " " . " " .
$output['new_icon'] . $output['rec_labels'] . " "
. $output['admin_link']
. $output['alternate_title']
. $output['access_info']
. $output['description']
. $output['url']
. $output['subject_terms']
. $output['form_subdivisions']
. $output['dates_of_coverage']
. $output['update_frequency']
. $output['place_terms'],
/* snip */
Also ich weiß, dass ich kann verwenden Sie isset() hier für jedes Element. Ich würde neu anordnen, die Dinge ein wenig, und entfernen Sie alle die Verkettung, wie es jetzt ist. Gibt es irgendeine andere einfache Möglichkeit, dies zu tun, oder bin ich einfach dabei geblieben?
isset()
oder empty()
auf alle Prüfungen mit arrays ganz geisttötende. InformationsquelleAutor der Frage | 2009-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Herausfinden, welche Schlüssel in die $Ausgabe array, und füllen Sie die fehlenden mit leeren Saiten.
InformationsquelleAutor der Antwort SquareRootOf2
Können Sie isset (), ohne die Verkettung:
Könnte man auch eine Funktion schreiben, die den string, wenn es gesetzt ist - dies ist wahrscheinlich nicht sehr effizient:
Werden Sie nicht bekommen eine Benachrichtigung, weil die variable per Referenz übergeben.
InformationsquelleAutor der Antwort Tom Haigh
Variation auf SquareRootOf2 Antwort, aber dies sollte vor der ersten Verwendung der $output variable:
InformationsquelleAutor der Antwort Sterling Hirsh
Wenn Sie die Pflege von altem code, werden Sie wahrscheinlich nicht anstreben "der bestmögliche code immer"... Das ist eine Falle, wenn, meiner Meinung nach, Sie senken könnte, die
error_reporting
Ebene.Diese "undefined index" sollten nur Hinweise ; so konnten Sie die
error_reporting
Ebene ausschließen, verstoßen.Ist eine Lösung, mit der
error_reporting
Funktion, wie diese :Die gute Sache mit dieser Lösung können Sie es ausschließen, merkt nur, wenn es notwendig ist (sagen wir, zum Beispiel, wenn es nur eine oder zwei Dateien mit dieser Art von code)
Eine andere Lösung wäre, um diese in php.ini (vielleicht nicht so eine gute Idee, wenn Sie arbeiten, auf mehrere Anwendungen, obwohl, wie könnte es Maske nützliche Hinweise ) ; siehe
error_reporting
in php.ini.Aber ich betone : dies ist nur akzeptabel, weil Sie die Pflege einer alten Anwendung, die Sie nicht tun sollten, wenn die Erschliessung neuer code !
InformationsquelleAutor der Antwort Pascal MARTIN
Satz jeder index im array zu Beginn (oder vor der
$output
array verwendet wird) wäre wohl die einfachste Lösung für Ihren Fall.Beispiel
Auch nicht wirklich relevant für Ihren Fall aber, wo Sie sagten, Sie waren neu in PHP und das ist nicht wirklich sofort ersichtlich
isset()
können mehrere Argumente. So in der Stelle:Können Sie tun:
InformationsquelleAutor der Antwort MitMaro
Dies ist die Schnellste Lösung, die ich denken kann, aber bei weitem nicht die beste. So sehen Sie als eine "not-Lösung":
Den
@
unterdrückt alle PHP-Warnungen und Fehler.InformationsquelleAutor der Antwort Kai Noack
Einen kurzen Lösung (PHP 5.3+):
Erhalten Sie entweder den Wert der Variablen, wenn es nicht zu false ausgewertet, oder der falsche Ausdruck. (Nach dem ':')
Verwendung des ternär, ohne "wenn " true" - parameter, wird das Ergebnis der test-Ausdruck (Das erste ) Da undefined, false, false-Ausdruck zurückgegeben werden.
In PHP 7 gibt es die etwas elegantere Null coalescing-operator:
(Es wäre schön, mit einem Standard-Zuweisungsoperator wie '?=')
InformationsquelleAutor der Antwort Simon Rigét
Gleiche Idee wie Michael Wasserfall
Vom CodeIgniter
InformationsquelleAutor der Antwort Jerome Jaglale
Sie könnten versuchen, mit einer netten, kleinen Funktion, die den Rückgabewert, wenn es vorhanden ist, oder ein leerer string, wenn nicht. Dies ist, was ich verwenden:
Dann können Sie es verwenden, wie diese:
Und es wird nicht werfen Fehler!
Hoffe, das hilft!
InformationsquelleAutor der Antwort Michael Waterfall
InformationsquelleAutor der Antwort jenson