enrico: Warnungen bei Ausführung von PHP-Code

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

  1. 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

    1. 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

  2. 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.

    --
    Once is a mistake, twice is Jazz.
    1. 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