Warnungen bei Ausführung von PHP-Code
enrico
- php
Guten Abend,
ich habe innerhalb eines switch-Blockes folgenden Code:
$Array_Anfangsbuchstaben = array ();
for ($i = 0; $i < count ($Inhalt); $i++)
{
$Erstes_Zeichen = substr ($Inhalt[$i]["Titel"], 0, 1);
if (is_numeric ($Erstes_Zeichen))
{
$Erstes_Zeichen = "Zahl, Zeichen, ...";
}
if (! Array_durchsuchen ($Erstes_Zeichen, "Titel", $Inhalt))
{
array_push ($Array_Anfangsbuchstaben, $Erstes_Zeichen);
}
$Array_Anfangsbuchstaben = sort (array_unique ($Array_Anfangsbuchstaben));
}
Der Wert des assoziativen Arrays "Inhalt" wird mir ganz am Beginn der PHP-Seite, also außerhalb
des switch-Blockes über folgende Anweisung erzeugt:
$Inhalt = unserialize (base64_decode (file_get_contents ("../SAMMLUNG/Sammlung_Temp.txt")));
Die Funktion "Array_durchsuchen" sieht folgendermassen aus:
function Array_durchsuchen ($Suchbegriff, $Spalte, $Zu_durchsuchendes_Array)
{
if (! empty ($Zu_durchsuchendes_Array) && is_array ($Zu_durchsuchendes_Array))
{
for ($i = 0; $i < count ($Zu_durchsuchendes_Array); $i++)
{
if ($Zu_durchsuchendes_Array[$i][$Spalte] == $Suchbegriff ||
strcmp ($Zu_durchsuchendes_Array[$i][$Spalte], $Suchbegriff) == 0)
{
return true;
}
}
}
return false;
}
Diese Funktion liegt ebenfals außerhalb des switch-Blockes.
Das assoziative Array wird mir korrekt übergeben, da ich mir innerhalb des switch-Blockes beliebige
Elemente ausgeben lassen kann und diese auch korrekt sind.
Beim Ausführen der Seite bekomme ich bezüglich des obiggen Codes aber folgende Warnungen:
Warning: array_push() [function.array-push]: First argument should be an array
Warning: array_unique() [function.array-unique]: The argument should be an array
Warning: sort() expects parameter 1 to be array, boolean given
Was ich nicht verstehe, ist die Tatsache, dass obiger Code außerhalb des switch-Blockes ohne Probleme
klappt.
Warum erhalte ich die Warnungen ? Woran liegt es ?
Vielen Dank für Eure Rückantworten.
Gruß
enrico
Hallo Enrico,
$Array_Anfangsbuchstaben = array ();
for ($i = 0; $i < count ($Inhalt); $i++)
{
$Erstes_Zeichen = substr ($Inhalt[$i]["Titel"], 0, 1);
[...]
if (! Array_durchsuchen ($Erstes_Zeichen, "Titel", $Inhalt))
{
array_push ($Array_Anfangsbuchstaben, $Erstes_Zeichen);
Verwende statt array_push() doch besser
$Array_Anfangsbuchstaben[] = $Erstes_Zeichen;
}
$Array_Anfangsbuchstaben = sort (array_unique ($Array_Anfangsbuchstaben));
Aus welchem Grund willst Du bei jedem Schleifendurchlauf eine Sortierung vornehmen? Sortieren ist ein aufwendiger Vorgang. Sortiere besser ein einziges Mal nach Ende der Schleife.
Der Wert des assoziativen Arrays "Inhalt" wird mir ganz am Beginn der PHP-Seite, also außerhalb
des switch-Blockes über folgende Anweisung erzeugt:$Inhalt = unserialize (base64_decode (file_get_contents ("../SAMMLUNG/Sammlung_Temp.txt")));
ja, ich kann mich ann Deine Diskussion mit Martin erinnern. Nein, ich bin nicht der Ansicht, dass diese Schachtelung eine gute Idee ist. Packe den Aufruf von file_get_contents() in eine eigene Anweisung. Prüfe den Erfolg. Bei base64_decode und unserialize sehe ich keine Probleme, die können ruhig weiter verschachtelt bleiben.
Freundliche Grüße
Vinzenz
Hallo,
das Problem mit den Warnungen hätten wir gelöst, ich mußte die beiden Anweisungen
"array_unique" und "sort" in meinem Fall, u.U. auch generell, nur alleine notieren,
ohne eine erneute Zuweisung zu machen:
So funktionierte es nicht:
$_Array = array_unique ($_Array);
$_Array = sort ($_Array);
So klappt es bestens:
array_unique ($_Array);
sort ($_Array);
Nun stehe ich aber vor dem heftigen Vorhaben, eine Funktion zu entwickeln, die mir
die verschiedenen Auswahllisten den ausgewählten Kriterien entsprechend füllt, auch
unter Berücksichtigung der Abhängigkeiten.
Klingt kompliziert, sollte aber an folgender Erläuterung klar werden:
In Excel kann man verschiedene Filterkriterien auswählen, nach denen ein Sheet
sortiert werden kann, so will ich es auch handhaben:
Bislang habe ich folgende Schritte erfolgreich umgesetzt:
1. Festlegung der gewünschten Filterkriterien, wobei die Listen dynamisch um bereits
gewählte Kriterien reduziert werden:
Liste 1: Liste 2: Liste 3:
-Keine Auswahl -Keine Auswahl -Keine Auswahl
-Anfangsbuchstabe -Anfangsbuchstabe -Anfangsbuchstabe
-Genre -Genre -Genre
-FSK -FSK -FSK
Verfügbare Kriterien nach Auswahl "Anfangsbuchstabe" aus Liste 1:
Liste 1: Liste 2: Liste 3:
-[Anfangsbuchstabe] -Keine Auswahl -Keine Auswahl
-Keine Auswahl -Genre -Genre
-Genre -FSK -FSK
-FSK
Verfügbare Kriterien nach Auswahl "FSK" aus Liste 2:
Liste 1: Liste 2: Liste 3:
-[Anfangsbuchstabe] -[FSK] -Keine Auswahl
-Keine Auswahl -Keine Auswahl -Genre
-Genre
-FSK
Diesen Mechanismus habe ich für alle drei Listen eingebaut, so dass man hier völlig
freie Hand hat, was die Filterungwünsche angeht:
Anfangsbuchstabe -> Genre -> FSK
Genre -> FSK
FSK -> Genre
Anfangsbuchstabe
...usw...
2. Über die Schaltfläche "Listen füllen" will ich nun die Auswahllisten entsprechend der
zuvor ausgewählten Kriterien füllen lassen, zunächst ohne unmittelbare Abhängigkeiten
zueinander, diese sollen erst im Schritt 3 greifen.
Das Befüllen ist ansich kein Problem, ich habe es, aus programmiertechnischer Sicht,
sicherlich zu umständlich umgesetzt, aber es klappt:
[1] $Array_Anfangsbuchstaben = Anfangsbuchstaben_zurueckliefern ($Inhalt);
[A] $Optionen_Filter_1 = Liste_fuellen ($Array_Anfangsbuchstaben);
[1] function Anfangsbuchstaben_zurueckliefern ($Inhalt)
{
$Array_Temp = array ();
for ($i = 0; $i < count ($Inhalt); $i++)
{
$Erstes_Zeichen = substr ($Inhalt[$i]["Titel"], 0, 1);
if (is_numeric ($Erstes_Zeichen))
{
$Erstes_Zeichen = "#";
}
if (! in_array ($Erstes_Zeichen, $Array_Temp))
{
array_push ($Array_Temp, $Erstes_Zeichen);
}
}
array_unique ($Array_Temp);
sort ($Array_Temp);
return $Array_Temp;
}
[2] $Array_Genres = Genres_zurueckliefern ($Inhalt);
[A] $Optionen_Filter_1 = Liste_fuellen ($Array_Genres);
[2] function Genres_zurueckliefern ($Inhalt)
{
$Array_Temp = array ();
for ($i = 0; $i < count ($Inhalt); $i++)
{
if (! in_array ($Inhalt[$i]["Genre"], $Array_Temp))
{
array_push ($Array_Temp, $Inhalt[$i]["Genre"]);
}
}
array_unique ($Array_Temp);
sort ($Array_Temp);
return $Array_Temp;
}
[A] function Liste_fuellen ($Array_Optionen)
{
$Array_Temp = "";
for ($i = 0; $i < count ($Array_Optionen); $i++)
{
$Array_Temp .= '<option value="' . $Array_Optionen[$i] . '">' . $Array_Optionen[$i] . '</option>';
}
return $Array_Temp;
}
------------------------------
3. Erstellung einer universellen Funktion zum Befüllen der Listen, unter Berücksichtigung
gegebener Abhängigkeiten:
Hier liegt mein Problem:
Mein Problem ist nun, wie ich eine universelle Funktion erstellen muß, so dass ich per Übergabe
spezifischer Parameter und unter Berücksichtigung etwaiger Abhängikeiten die Listen füllen kann:
Ein paar Beispiele zur Verdeutlichung, die Schritte 1 und 2 lasse ich jetzt weg:
Meine Textdatei enthält ausschnittsweise folgende Angaben (die Inhaltsbeschreibungen sind
unwichtig und deshalb ebenfalls ausgespart):
1|LIGHTHOUSE - INSEL DES GRAUENS|Horror/Thriller|16
2|ORIGINAL SIN|Drama/Thriller|16
3|OPEN WATER 2|Thriller|12
4|LEFT IN DARKNESS - DÄMONEN DER DUNKELHEIT|Horror/Fantasy|18
In diesem Fall ergäben sich bei den nachfolgenden Auswahlmöglichkeiten die genannten Abhängigkeiten:
Anfangsbuchstabe -> FSK
L -> -16
-18
Es gibt 2 Filme, die mit "L" beginnen und die ab 16 bzw. 18 freigegeben sind
Genre -> Anfangsbuchstabe
Horror/Thriller -> L
Es gibt nur eine Film aus dem Genre "Horror/Thriller", somit steht auch nur der Anfangsbuchstabe "L"
zur Auswahl.
...usw...
Und hier eine universelle Funktion zu kreiren, die mir flexibel nach den übergebenen Kriterien (entweder
nur ein Kriterium, es können aber auch alle drei gewählt werden) die Listen befüllt, ist mein Problem.
Könnt Ihr mir hier weiterhelfen und mir Ratschläge geben, wie diese Funktion aussehen müsste ?
Wie immer: vielen, vielen, vielen lieben Dank für Eure Unterstützung.
Gruß
enrico
Tach.
$Array_Anfangsbuchstaben = sort (array_unique ($Array_Anfangsbuchstaben));
Beim Ausführen der Seite bekomme ich bezüglich des obiggen Codes aber folgende Warnungen:
Warning: array_push() [function.array-push]: First argument should be an array
Warning: array_unique() [function.array-unique]: The argument should be an array
Warning: sort() expects parameter 1 to be array, boolean given
Ein kurzer Blick ins Handbuch hätte Dir verraten, daß sort nicht das sortierte Array zurückgibt. Geändert wird direkt das Array, welches Du als Referenz an die Funktion übergibst.
Hallo,
Warning: sort() expects parameter 1 to be array, boolean given
Ein kurzer Blick ins Handbuch hätte Dir verraten, daß sort nicht das sortierte Array zurückgibt.
da sieht man, dass ich in PHP nie sortiere :-)
Einmaliges korrektes Aufrufen der Sortierroutine nach Ende der for-Schleife sollte alle Warnungen beseitigen.
Freundliche Grüße
Vinzenz